在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
但我正在寻找循环脚本。如何将这些名称附加到脚本
答案 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
)
;
...