2010-07-22 100 views
1

比方说,我有一些更新脚本:在多个数据库(SQL Server)上运行脚本?

update sometable set somecolumn = 'somevalue' where xyz = 0 

现在让我们说我有多个数据库,如DB1,DB2,DB3等。我怎么能在没有手动执行的情况下在这些脚本上运行这个脚本?

谢谢:)

+0

检查更新回答 – 2010-07-22 06:30:59

回答

1

如果你想所有的数据库,你可以使用sp_MSforeachdb

http://www.databasejournal.com/features/mssql/article.php/3441031/SQL-Server-Undocumented-Stored-Procedures-spMSforeachtable-and-spMSforeachdb.htm

EXEC sp_MSforeachdb @command1="UPDATE ?..sometable SET somecolumn='somevalue' WHERE xyz=0" 

或特定的数据库,你可以尝试一些逻辑如下所示:

http://www.sqlservercurry.com/2009/04/6-common-uses-of-undocumented-stored.html

希望有所帮助。

+0

这也是一个不错的功能! – grady 2010-07-22 07:23:35

+0

不建议将未记录的存储过程用于除特殊情况外的任何情况,因为它们可能会随时更改甚至删除。尽管你总是可以轻松地推出自己的产品。 – 2014-04-30 09:24:31

2

可以使用光标

  • 所有服务器获取列表在你的局域网或网络

  • 不是创建光标做到这一点使用sp_executesql运行更新脚本,使用forpart查询

    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    GO 
    
    CREATE PROCEDURE [sp_cross_db_query] 
    @SQLQuery varchar(400) 
    AS 
    
    DECLARE @DB_Name varchar(100) 
    DECLARE database_cursor CURSOR FOR 
    
    SELECT DatabaseName 
    FROM Management.dbo.Customers 
    
    OPEN database_cursor 
    
    FETCH NEXT FROM database_cursor INTO @DB_Name 
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        exec(
         'USE [' + @DB_Name + '];' + 
         @SQLQuery 
         ) 
         FETCH NEXT FROM database_cursor INTO @DB_Name 
    END 
    CLOSE database_cursor 
    DEALLOCATE database_cursor 
    

    运行查询

    exec sp_cross_db_query 'SELECT count(*) FROM Products' 
    
+0

谢谢,你能给我一些SQL吗? – grady 2010-07-22 06:25:34

+0

检查更新回答 – 2010-07-22 06:30:26

+0

谢谢, 从Management.dbo.Customers是造成一些麻烦...什么错了? – grady 2010-07-22 06:37:34

相关问题