sp_execute attend le paramètre '@handle' de type 'int'


9

J'essaie de vérifier dans une procédure stockée si une table existe dans ma base de données de destination. Si ce n'est pas le cas, je vais créer la table en utilisant les tables information_schema de la base de données source. Cependant, lorsque j'utilise sp_execute pour essayer de ramener si la table existe, je reçois l'erreur La procédure attend le paramètre '@handle' de type 'int'.

Je n'utilise pas de paramètre @handle. Quelqu'un peut-il me dire ce que signifie cette erreur et pourquoi je la reçois? La partie pertinente de mon code est ci-dessous.

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
Vouliez-vous appeler sp_executesqlplutôt que sp_execute?
Philᵀᴹ

La variable @TableNotExistsOutn'est pas orthographiée correctement dans le texte SQL.
Jon Seigel

Réponses:


11

Je pense que vous vouliez utiliser sp_executesql:

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

Et comme JonSeigel l'a souligné dans le commentaire, vous avez mal orthographié un paramètre dans votre déclaration:

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'

Ça devrait l'être @TableNotExistsOUT.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.