Maison >base de données >tutoriel mysql >Comment transmettre des variables de table aux instructions SQL dynamiques dans SQL Server ?

Comment transmettre des variables de table aux instructions SQL dynamiques dans SQL Server ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 16:54:44515parcourir

How to Pass Table Variables to Dynamic SQL Statements in SQL Server?

Passer des variables de table aux instructions SQL dynamiques dans SQL Server

Lors de la création de procédures stockées, vous pouvez rencontrer le défi de référencer les variables de table déclarées dans des instructions SQL dynamiques. Cela peut entraîner une erreur indiquant que la variable doit être déclarée.

Considérons l'exemple suivant :

<code class="language-sql">set @col_name =  'Assoc_Item_' 
              + Convert(nvarchar(2), @curr_row1);

set @sqlstat = 'update @RelPro set ' 
             + @col_name 
             + ' = (Select relsku From @TSku Where tid = ' 
             + Convert(nvarchar(2), @curr_row1) + ') Where RowID = ' 
             + Convert(nvarchar(2), @curr_row);

Exec(@sqlstat);</code>

L'exécution de cette instruction peut produire l'erreur suivante :

  • La variable de table "@RelPro" doit être déclarée.
  • La variable de table "@TSku" doit être déclarée.

Pour résoudre ce problème, des paramètres table (TVP) peuvent être utilisés. TVP permet de transmettre des variables de table à des instructions SQL dynamiques sans les déclarer explicitement. Attention cependant : cette méthode ne peut pas être utilisée pour mettre à jour les valeurs du tableau.

Par exemple, considérons le code modifié suivant :

<code class="language-sql">CREATE TYPE MyTable AS TABLE 
( 
Foo int,
Bar int
);
GO


DECLARE @T AS MyTable;

INSERT INTO @T VALUES (1,2), (2,3)

SELECT *,
        sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
FROM @T

EXEC sp_executesql
  N'SELECT *,
        sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
    FROM @T',
  N'@T MyTable READONLY',
  @T=@T </code>

Ce code démontre que la variable de table référencée dans la sous-portée (dans l'instruction dynamique) est la même que la variable de table dans la portée externe, évitant ainsi l'erreur. La clé est d'utiliser sp_executesql et de déclarer correctement les types et paramètres TVP. Pour les opérations de mise à jour, une approche différente est requise, comme l'utilisation de curseurs ou d'autres alternatives.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn