针对多个数据库创建存储过程的查询意外失败

时间:2017-03-15 17:23:05

标签: sql sql-server tsql sql-server-2014

我正在尝试运行SQL查询以在多个数据库中创建存储过程。

我正在运行以下查询:

DECLARE @sqlStmt nvarchar(max)

select name from sys.databases where name not in ('master', 'tempdb', 'model', 'msdb')

DECLARE dbCursor CURSOR
FOR select name from sys.databases where name not in ('master', 'tempdb', 'model', 'msdb')

DECLARE @dbname varchar(max)

OPEN dbCursor

fetch next from dbCursor into @dbname

while @@FETCH_STATUS = 0
BEGIN
    declare @stmt nvarchar(max)
    SET @stmt = 'USE ' + @dbname + ';';
    EXECUTE sp_executesql @stmt

    declare @correctTableExists bit

    set @correctTableExists = (select case when Exists(SELECT TABLE_SCHEMA + '.' + TABLE_NAME, *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME in ('MasterSchedules', 'Client'))
    THEN 1
    ELSE 0
    END)

if @correctTableExists = 1
    BEGIN TRY

        set @stmt = 'USE ' + @dbName + '

GO

CREATE PROCEDURE spGetMasterScheduleByID 
    @masterScheduleID int
AS 
BEGIN 
SELECT * FROM MasterSchedules 
WHERE MasterScheduleID = @masterScheduleID 
END'
        EXECUTE sp_executesql @stmt
    END TRY
    BEGIN CATCH
        SELECT   
            ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_MESSAGE() AS ErrorMessage;
        print @stmt + '
        Failed for ' + @dbName
    END CATCH

FETCH NEXT FROM dbCursor
INTO @dbname
END
CLOSE dbCursor;
DEALLOCATE dbCursor;

但是,我收到以下错误消息:

Error 102
Incorrect syntax near 'GO'.

当我查看消息时,我看到每个数据库名称的以下消息我正在运行此消息:

(1 row(s) affected)
USE [Database Name]

GO

CREATE PROCEDURE spGetMasterScheduleByID 
    @masterScheduleID int
AS 
BEGIN 
    SELECT * FROM MasterSchedules 
    WHERE MasterScheduleID = @masterScheduleID 
END
            Failed for [Database Name]

为什么SQL Server认为这是"语法错误"鉴于它显然是完全有效的语法?当我将该确切查询复制并粘贴到SSMS中时,查询工作正常。

我已经尝试过以多种方式运行查询,例如

exec @stmt
execute @stmt
execute (@stmt)
EXECUTE sp_executesql @stmt

1 个答案:

答案 0 :(得分:1)

  

GO不是Transact-SQL语句;这是一个被公认的命令   sqlcmd和osql实用程序以及SQL Server Management Studio代码   编辑器。

https://msdn.microsoft.com/en-us/library/ms188037.aspx