Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 循环脚本不工作_Sql_Sql Server_Tsql - Fatal编程技术网

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