2010-03-02 3 views
5

Existe-t-il un moyen de convertir la chaîne @my_variable en une valeur de @my_variable?t-sql obtient une valeur de variable à partir d'une chaîne avec le nom de variable

J'ai une table qui stocke les noms des variables. J'ai besoin de connaître la valeur de cette variable. Quelque chose comme ceci:

DECLARE @second_variable AS NVARCHAR(20); 
DECLARE @first_variable AS NVARCHAR(20); 
SET @first_variable = '20'; 
SET @second_variable = SELECT '@first_variable'; --here I want that @second variable be assigned a value of "20". 

Répondre

1

La solution la plus probable à votre problème est de traiter/modifier/corriger la conception qui exige pourquoi vous have a table which stores names of variables.

0

essayer sp_executesql

declare @f nvarchar(20) 
declare @s nvarchar(20) 
declare @sT nvarchar(100) 

set @f = '20' 
set @sT = 'set @s = ''' + @f + '''' 

exec sp_executesql @sT, N'@s nvarchar(20) output', @s output 

print @s 
+0

Je ne pense pas que ce soit ce que Markus veut: Il veut convertir ''@ f'' (notez les guillemets) en 20, avec la chaîne'' @ f'' provenant d'une table. Dans votre exemple, vous utilisez explicitement '@ f', c'est-à-dire qu'il est lié au moment de la compilation. – Heinzi

1

Vous pouvez utiliser sp_executesql pour exécuter des chaînes (vous pouvez donc faire quelque chose comme sp_executesql 'SET @second_variable = ' + @name_of_variable;). Cependant, le simple fait de placer cette instruction dans sp_executesql ne fonctionnera pas, puisque strings executed with sp_executesql or EXECUTE have their own variable scope, et, par conséquent, ni @second_variable ni @first_variable ne sont accessibles.

Alors, ce que vous pourriez faire serait de déplacer votre complète code (à l'exclusion du nom de la variable) dans une déclaration sp_executesql (non testé):

DECLARE @name_of_variable NVARCHAR(MAX) 
SET @name_of_variable = ... 

EXECUTE sp_executesql N'...lots of code... ' + @name_of_variable + ' ...lots of code...' 
+0

http://www.sommarskog.se/dynamic_sql.html –

Questions connexes