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