sp_execute espera o parâmetro '@handle' do tipo 'int'

9

Estou tentando verificar em um procedimento armazenado se existe uma tabela no meu banco de dados de destino. Caso contrário, criarei a tabela usando as tabelas information_schema do banco de dados de origem. No entanto, quando eu uso sp_execute para tentar retornar se a tabela existir, estou recebendo o erro O procedimento espera o parâmetro '@handle' do tipo 'int'.

Não estou usando um parâmetro @handle. Alguém pode me dizer o que esse erro significa e por que estou recebendo? A parte relevante do meu código está abaixo.

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
Grumoso
fonte
4
Você quis ligar em sp_executesqlvez de sp_execute?
31412
A variável @TableNotExistsOutestá grafada incorretamente no texto SQL.
31412 Jon Seigel

Respostas:

11

Eu acho que você pretendia usar sp_executesql:

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

E como JonSeigel apontou no comentário, você digitou incorretamente um parâmetro em sua declaração:

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'

Isso deveria ser @TableNotExistsOUT.

Thomas Stringer
fonte