sp_execute oczekuje parametru „@handle” typu „int”

9

Próbuję sprawdzić w procedurze przechowywanej, czy tabela istnieje w mojej docelowej bazie danych. Jeśli tak się nie stanie, utworzę tabelę przy użyciu tabel Information_schema ze źródłowej bazy danych. Jednak gdy używam sp_execute, aby spróbować przywrócić, jeśli tabela istnieje, pojawia się błąd Procedura oczekuje parametru „@handle” typu „int”.

Nie używam parametru @handle. Czy ktoś może mi powiedzieć, co oznacza ten błąd i dlaczego go otrzymuję? Odpowiednia część mojego kodu znajduje się poniżej.

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
Grudkowaty
źródło
4
Czy miałeś na myśli sp_executesqlraczej zadzwonić niż sp_execute?
Philᵀᴹ
Zmienna @TableNotExistsOutjest niepoprawnie napisana w tekście SQL.
Jon Seigel

Odpowiedzi:

11

Myślę, że chciałeś użyć sp_executesql:

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

I jak zauważył JonSeigel w komentarzu, źle wpisałeś parametr w swoim oświadczeniu:

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'

Tak powinno być @TableNotExistsOUT.

Thomas Stringer
źródło