sp_execute erwartet den Parameter '@handle' vom Typ 'int'


9

Ich versuche, eine gespeicherte Prozedur einzuchecken, wenn eine Tabelle in meiner Zieldatenbank vorhanden ist. Wenn dies nicht der Fall ist, erstelle ich die Tabelle unter Verwendung der Tabellen information_schema aus der Quellendatenbank. Wenn ich jedoch sp_execute verwende, um zu versuchen, die Tabelle wiederherzustellen, erhalte ich den Fehler. Die Prozedur erwartet den Parameter '@handle' vom Typ 'int'.

Ich verwende keinen @ handle-Parameter. Kann mir jemand sagen, was dieser Fehler bedeutet und warum ich ihn erhalte? Der relevante Teil meines Codes ist unten.

DECLARE @SQL NVARCHAR(MAX),
        @Parameters NVARCHAR(4000),
        @TableNotExists INT,
        @SourceTable NVARCHAR(200),
        @DestDB NVARCHAR(200)

BEGIN

SET @SourceTable = 'table'
SET @DestDB = 'database'
SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT'
SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' AND TABLE_NAME = @SourceTableIN)
BEGIN SET @TableNotExistOUT = 1 END'

EXEC sp_Execute @SQL, @Parameters, @SourceTableIN = @SourceTable, @TableNotExistsOUt = @TableNotExists OUTPUT

END

4
Wollten Sie sp_executesqllieber anrufen als sp_execute?
Philᵀᴹ

Die Variable @TableNotExistsOutist im SQL-Text falsch geschrieben.
Jon Seigel

Antworten:


11

Ich denke, Sie wollten verwenden sp_executesql:

EXEC sp_Executesql @SQL, @Parameters, @SourceTableIN = @SourceTable, @TableNotExistsOut = @TableNotExists OUTPUT

Und wie JonSeigel im Kommentar betonte, haben Sie in Ihrer Aussage einen Parameter falsch geschrieben:

SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' AND TABLE_NAME = @SourceTableIN)
BEGIN SET @TableNotExistOUT = 1 END'

Das sollte sein @TableNotExistsOUT.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.