2015-07-16 1 views
1

J'ai une procédure stockée qui utilise un paramètre @n et @colname et utilise @n pour calculer certaines informations. À l'heure actuelle, @colname ne fait rien car T-SQL ne vous permet pas de créer un nom de colonne à partir d'un paramètre. Il y a des exemples de personnes qui disent que vous pouvez le faire grâce à une procédure stockée dynamique, mais pour autant que je sache, ils ne font pas ce que je veux.Attribution d'un nom à une colonne en tant que paramètre transmis à une procédure stockée

La raison de ceci est que je veux créer une autre procédure stockée qui utilise cette autre procédure stockée plusieurs fois et passe des valeurs différentes de @n et @colname.

Donc, juste pour préciser encore une fois, je voudrais être en mesure d'écrire une procédure stockée dynamique qui fait cela:

SELECT a, b, c AS @colname 
FROM t1 
WHERE b = @n 

Ensuite, une fois que je peux le faire, je vais écrire mon autre procédure stockée comme ceci:

EXEC stored_procedure1 @n = 3, @colname = 'Column 1' 
EXEC stored_procedure1 @n = 6, @colname = 'Column 2' 

Toute aide à ce sujet serait grandement appréciée. Merci à l'avance

+0

Vous pouvez uniquement paramétrer des données. vous ne pouvez pas paramétrer les noms de colonne, les noms de table ou les alias. C'est seulement possible si vous utilisez SQL dynamique, mais c'est quelque chose que je ne ferais qu'en dernier recours. Pourquoi avez-vous besoin de différents alias pour la colonne en premier lieu? –

+0

Je veux utiliser SQL dynamique, je ne suis pas inquiet de l'injection SQL ou quelque chose comme ça. J'ai besoin de différents alias car chaque colonne représentera des données différentes. Les requêtes actuelles sont beaucoup plus complexes que ce que j'ai écrit ci-dessus, je voulais juste donner un exemple simple – Jason

+0

Cela semble fragile et sortir. – granadaCoder

Répondre

1

Vous devez faire une requête dynamique comme ci-dessous

EXEC ('SELECT a, b, c AS ['+ @colname + 
'] FROM t1 WHERE b = ' + @n) 

repos espère que vous pouvez trouver.

+1

il vous manque un espace entre l'alias et le. aussi, je voudrais utiliser des crochets autour de l'alias pour activer les alias avec des espaces blancs ou qui sont des mots réservés et autres. –

+1

Cela fonctionne jusqu'à ce qu'il y ait un espace dans @colname. Alors c'est cassé. Il devrait être enveloppé dans QUOTENAME. –

+0

Heureusement, toutes mes colonnes seront sans espaces, mais merci de le signaler – Jason

1

Voici une autre façon de le faire en utilisant l'exemple bien publié par Rahul. Cela permettra d'accueillir un espace et empêchera l'injection de sql. Veuillez noter que le prédicat where a également été paramétré.

declare @SQL nvarchar(max) 

set @SQL = 'SELECT a, b, c AS ' + quotename(@colname) + 
' FROM t1 WHERE b = @n' 

exec sp_executesql @SQL, N'@n int', @n = @n 
+1

Merci Martin. Édité. –