sp_execute ожидает параметр '@handle' типа 'int'

9

Я пытаюсь проверить хранимую процедуру, если таблица существует в моей целевой базе данных. Если этого не произойдет, я создам таблицу с использованием таблиц information_schema из исходной базы данных. Однако когда я использую sp_execute, чтобы попытаться вернуть таблицу, если она существует, я получаю сообщение об ошибке. Процедура ожидает параметр '@handle' типа 'int'.

Я не использую параметр @handle. Может кто-нибудь сказать мне, что означает эта ошибка и почему я ее получаю? Соответствующая часть моего кода ниже.

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
Вы хотели позвонить, sp_executesqlа не sp_execute?
Philᵀᴹ
Переменная @TableNotExistsOutнеправильно написана в тексте SQL.
Джон Зигель

Ответы:

11

Я думаю, что вы хотели использовать sp_executesql:

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

И, как указал JonSeigel в комментарии, вы неправильно указали параметр в своем утверждении:

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'

Это должно быть @TableNotExistsOUT.

Томас Стрингер
источник