Sql 循环脚本不工作
我只是尝试在系统数据库之外的用户数据库中创建表 这是剧本Sql 循环脚本不工作,sql,sql-server,tsql,Sql,Sql Server,Tsql,我只是尝试在系统数据库之外的用户数据库中创建表 这是剧本 Declare @V table (ID INT,name varchar(100)) DECLARE @DatabaseName VARCHAR(50), @SQL NVARCHAR(MAX) INSERT INTO @V(Id,name) select ROW_NUMBER()OVER(ORDER BY NAME), name from sys.databases
Declare @V table (ID INT,name varchar(100))
DECLARE
@DatabaseName VARCHAR(50),
@SQL NVARCHAR(MAX)
INSERT INTO @V(Id,name)
select ROW_NUMBER()OVER(ORDER BY NAME),
name
from sys.databases
where database_id >= 5
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
set @Name = @DatabaseName
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName)
+'CREATE TABLE T(ID INT)';
SET @LoopCounter = @LoopCounter + 1
-- PRINT(@DatabaseName);
--PRINT(@SQL);
EXECUTE(@SQL)
END
您的脚本存在以下问题:
WHILE(@LoopCounter IS NOT NULL
AND @LoopCounter <= @MaxId)
BEGIN
SELECT @Name = Name
FROM @V WHERE Id = @LoopCounter
--set @Name = @DatabaseName -- this will assign value from @DatabaseName into @Name, but you should do the vice versa:
set @DatabaseName = @Name
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName)
+' CREATE TABLE T(ID INT)'; -- I would also add space here, it might work with [XXX]create table
SET @LoopCounter = @LoopCounter + 1
-- PRINT(@DatabaseName);
--PRINT(@SQL);
EXECUTE(@SQL)
END
WHILE(@LoopCounter不为空
和@LoopCounter您使用sp_MSforeachdb
过程的版本草稿也很好;您要求的版本没有写入系统数据库的名称。不幸的是,这仍然没有实现-数据库上没有可靠的标志或属性可以清楚地将其标识为用户数据库。Microsoft themselves在SSMS中列出“系统数据库”文件夹的内容时,将应用我在下面使用的(反向)标准…另请参见此处:
下面是一个经过测试的脚本:
DECLARE @sql varchar(max)
SET @sql='IF ''?'' IN (SELECT [name] FROM sys.databases WHERE CAST(CASE WHEN [name] IN (''master'',''model'',''msdb'',''tempdb'') THEN 1 ELSE is_distributor END AS bit)=0)
EXECUTE (''USE [?] CREATE TABLE T (ID int)'')'
EXEC sp_MSforeachdb @command1 = @Sql
你应该用这个来代替:是的,我有那个脚本,但需要在这个循环中执行script@aaronIsn这不是要创建类似于使用MYDB1CREATE TABLE
?另外,不用所有循环计数器等。你可以用游标。我已经用过了。你不应该告诉我这是不是原因吗?对不起,如果你不这样做,我帮不了你如果问题出在你的create
单词上,甚至告诉我出了什么问题,或者回答我。
SELECT
[name]
FROM sys.databases
WHERE CAST(CASE WHEN [name] IN ('master','model','msdb','tempdb') THEN 1 ELSE is_distributor END AS bit)=0
DECLARE @sql varchar(max)
SET @sql='IF ''?'' IN (SELECT [name] FROM sys.databases WHERE CAST(CASE WHEN [name] IN (''master'',''model'',''msdb'',''tempdb'') THEN 1 ELSE is_distributor END AS bit)=0)
EXECUTE (''USE [?] CREATE TABLE T (ID int)'')'
EXEC sp_MSforeachdb @command1 = @Sql