2010-08-02 6 views
1

Existe-t-il un moyen de transmettre la valeur de la variable de combinaison à une autre variable? Je suppose que mieux avec un simple code que j'ai écrit ...Besoin d'aide substitution de variable dans SQL

DECLARE @intFlag INT 
DECLARE @taxdepn1 varchar(1) = 'A' 
    ,@taxdepn2 varchar(1) = 'B' 
    ,@taxdepn3 varchar(1) = 'C' 
    ,@taxdepn4 varchar(1) = null --'D' ` 
DECLARE @xxx varchar(1000); 
SET @intFlag = 1 
WHILE (@intFlag <=4) 
BEGIN 
    set @xxx = '@taxdepn'+cast(@intFlag as CHAR) ; 
    -- Here, I want to get the actual value of @Taxdepn1 to @TaxDepn4 
    if @xxx is not null 
     begin 
      print 'do something for '[email protected] 
    end 
    set @intFlag = @intFlag+1 ; 
End 

Expected output 
    do something for A 
    do something for B 
    do something for C 

J'apprécie vraiment toute aide.

Merci.
Elmer

Répondre

1

Pour faire ce que vous essayez, vous devez utiliser SQL dynamique. Voici une alternative qui ne nécessite pas SQL dynamique, mais que vous définissez statiquement la référence que vous voulez faire:

WHILE (@intFlag <=4) 
BEGIN    

    SET @xxx = CASE @intFlag 
         WHEN 1 THEN @taxdepn1 
         WHEN 2 THEN @taxdepn2 
         WHEN 3 THEN @taxdepn3 
         ELSE @taxdepn4 
        END 

    IF @xxx IS NOT NULL 
    BEGIN 
     PRINT @xxx 
    END 

END 
+0

Salut Omg, Je ne peux pas utiliser ce cas lorsque les données réelles pourraient être plus de 4. – Elmer

1

En utilisant sp_executesql, mais est assez lourde. Le @ taxdepn1 ... @ taxdepn4 doit être transmis comme arguments et sql dynamique peut alors les utiliser pour faire une sur la volée d'évaluation, le retour de la valeur attribuée à un paramètre de sortie:

while (@intFlag <= 4) 
begin 
    declare @sql nvarchar(max); 
    set @sql = N'set @out = @in' + cast(@intFlag as nchar); 
    declare @xxx char(1); 
    exec sp_executesql @sql, 
     N'@in1 char(1), @in2 char(1), @in3 char(1), @in4 char(1), @out char(1) output', 
     @taxdepn1, @taxdepn2, @taxdepn3, @taxdepn4, @xxx output; 
    if @xxx is not null 
    begin 
    ... 
    end 
    set @intFlag += 1; 
end 
+0

Salut Remus Je vais essayer celui-ci .. Merci pour l'effort. – Elmer