2017-04-19 1 views
2

Je souhaite créer une procédure stockée avec des paramètres dynamiques. L'un de ces paramètres est un type de tableComment utiliser dynamiquement le type de table dans T-SQL

CREATE TYPE [dbo].[IdTable] AS TABLE ([Id] [int] NULL) 
GO 

CREATE PROCEDURE [dbo].[SP_deleteCells] 
    @table IdTable READONLY, 
    @tableName NVARCHAR(50), 
    @fieldName NVARCHAR(50), 
    @result BIT OUTPUT 
AS 
    DECLARE @SQL NVARCHAR(500); 

    SET @SQL='delete from TBL_CustomerTerminal where ID in (select ID from @table)' 
    EXEC (@SQL); 

    SET @result = @@ROWCOUNT; 

Comment puis-je exec ce code sans erreur ?? En ce moment, je reçois:

doit déclarer la variable de table "@table"

+3

Side note: vous devez ** ** pas utiliser le préfixe 'sp_' pour vos procédures stockées. Microsoft a [réservé ce préfixe pour son propre usage (voir * Naming Stored Procedures *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), et vous courez le risque d'un conflit de noms dans le futur. [Il est également mauvais pour les performances de votre procédure stockée] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Il vaut mieux éviter simplement 'sp_' et utiliser autre chose comme préfixe - ou pas de préfixe du tout! –

+0

Pourquoi utilisez-vous SQL dynamique ici du tout? Exécutez simplement l'instruction delete et oubliez le SQL dynamique. –

+0

c'était dynamiquely du tout mais je remplace le champ statique pour le travail certainement – saeid

Répondre

2

Utilisez sp_executesql

exec sp_executesql N'delete from TBL_CustomerTerminal where ID in (select ID from @table)' 
    , N'@table dbo.IdTable readonly' /* parameter declaration for sp_executesql */ 
    , @table /* pass the parameters */ 
1

Il ne semble pas que vous avez besoin SQL dynamique pour la requête ci-dessus . Mais je suppose que c'est juste un échantillon.

La requête SQL dynamique possède sa propre visibilité de code. Il ne peut voir aucune variable en dehors des variables définies localement. Si vous voulez passer des paramètres à votre requête, vous devez utiliser sp_executesql au lieu de EXEC.

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql

+0

merci de m'aider – saeid