如何一次在多个数据库中执行脚本

时间:2017-01-25 11:26:27

标签: sql sql-server

在Sql Server中

我有示例脚本

Declare @V table (name varchar(100))
INSERT INTO @V(name)
 select name  from sys.databases where database_id > 6

select NAME from @V

如果我执行此脚本,我会获得用户数据库列表

在我的实例中,我有以下数据库:

DatabaseName
mohan
Ravi

如何动态地将数据库名称附加到下面的脚本并执行以下数据库

中的脚本
Declare @V table (ID INT,name varchar(100))
INSERT INTO @V(Id,name)
 select ROW_NUMBER()OVER(ORDER BY NAME),name  from sys.databases where database_id > 6

 DECLARE @LoopCounter INT , @MaxId INT, 
        @Name NVARCHAR(100)
SELECT @LoopCounter = min(id) , @MaxId = max(Id) 
FROM @V

WHILE(@LoopCounter IS NOT NULL
      AND @LoopCounter <= @MaxId)
BEGIN
   SELECT @Name = Name
   FROM @V WHERE Id = @LoopCounter

   PRINT @Name  
   SET @LoopCounter  = @LoopCounter  + 1        
END


DECLARE @DatabaseName VARCHAR(50) =   @Name
    , @SQL NVARCHAR(MAX);

SET @SQL = N'USE ' + QUOTENAME(@DatabaseName)
+'CREATE TABLE T(ID INT)';

--PRINT(@SQL);


EXECUTE(@SQL);

因此,在所有用户数据库中都将创建表。我尝试过使用sp_msforeachdb

脚本:

DECLARE @Sql AS VARCHAR(4000)
SET @Sql = 'IF ''?'' NOT IN (''master'',''tempdb'',''model'',''msdb'',''ReportServer'',''ReportServerTempDB'') 
                        EXECUTE ('' USE [?] CREATE TABLE T (ID INT)'')'
                        EXEC sp_MSforeachdb @command1 = @Sql

但我正在寻找循环脚本。如何将这些名称附加到脚本

1 个答案:

答案 0 :(得分:0)

这里不需要循环。您可以一次生成整个语句。此查询填充包含多个USE和CREATE TABLE语句的var:

DECLARE @Qry NVARCHAR(MAX) = '';

-- Build dynamic SQL statement here.
-- 1 Row returned per target database .
SELECT
    @Qry +=  
        '
            USE' + QUOTENAME(Name) + ';

            CREATE TABLE T
                (
                    ID INT 
                )
            ;
        ' 
FROM    
    sys.Databases
WHERE
    database_id > 6
;


-- Remove comments from last line when happy with query.
PRINT @Qry
--EXECUTE sp_ExecuteSQL @Qry

返回

USE [X];

CREATE TABLE T
    (
        ID INT
    )
;

USE [Y];

CREATE TABLE T
    (
        ID INT
    )
;
...