2017-03-15 2 views
0

Ich versuche eine SQL-Abfrage auszuführen, um eine gespeicherte Prozedur in mehreren Datenbanken zu erstellen.Abfrage zum Erstellen einer gespeicherten Prozedur für eine Anzahl von Datenbanken schlägt unerwartet fehl

Ich verwende die folgende Abfrage:

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; 

Allerdings bekomme ich folgende Fehlermeldung:

Error 102 
Incorrect syntax near 'GO'. 

Wenn ich die Nachrichten schauen, sehe ich die folgende Meldung für jeden Datenbanknamen Ich führe dies gegen:

(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] 

Warum SQL Server denkt, dass dies "falsch ist Syntax "vorausgesetzt, es ist eindeutig perfekt gültige Syntax? Wenn ich diese genaue Abfrage in SSMS kopiere und einfüge, funktioniert die Abfrage einwandfrei.

Ich habe bereits versucht, die Abfrage auf verschiedene Weise ausgeführt wird, wie

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

Antwort

Verwandte Themen