2010-04-28 7 views

Répondre

15

Vous ne pouvez pas le faire parce que SQL est compilé avant de savoir ce que la valeur de @a est (je suppose en réalité vous voulez @a être un peu paramètre et pas dur codé comme dans votre exemple).

Au lieu de cela, vous pouvez le faire:

declare @a as varchar; 
set @a='TEST' 

declare @sql nvarchar(max) 
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x' 

exec sp_executesql @sql 

Mais attention, ceci est une vulnérabilité de sécurité (attaques par injection SQL) ne devrait donc pas être fait si vous ne pouvez pas faire confiance ou bien @a propre.

+1

Et ne pas utiliser SQL dynamique sauf si vous lisez cette première: http://www.sommarskog.se/dynamic_sql.html – HLGEM

1

Parce que les noms de colonnes sont résolues au moment de la compilation pas au moment de l'exécution de l'instruction SQL.

3

utilisation sp_executesql pour cette

Example 
SET @SQLString = N'SELECT * 
    FROM table1 
    WHERE timet = @time and items in (@item)'; 


DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

SET @ParmDefinition = N'@time timestamp, 
    @item varchar(max) '; 

EXECUTE sp_executesql 
    @SQLString 
    ,@ParmDefinition 
    ,@time = '2010-04-26 17:15:05.667' 
    ,@item = '''Item1'',''Item2'',''Item3'',''Item4''' 
    ; 
4

Parce que ce n'est pas autorisé.

Insted de cela, vous pouvez utiliser la requête SQL dynamique:

declare @a as varchar; 
set @a='TEST' 
exec ('select ' + @a + ' from x') 
+2

La question était pourquoi ce n'est pas permis, pas comment le contourner. Je ne peux pas voir que répondre avec "Parce que ce n'est pas permis" est très utile. –

+0

@David M: oui, c'est une solution de contournement seulement. Votre réponse est utile – Alex

+0

Merci pour 'exec' - il est plus facile de se souvenir que' exec sp_executesql' bla bla. Je me souviens toujours d'avoir des erreurs avec ce SP, comme "pas autorisé à exécuter cette procédure". –

Questions connexes