web-dev-qa-db-fra.com

Comment définir des macros dans SQL Server?

Je veux définir une macro dans mon script SQL et plus tard, en fonction de ma requête conditionnelle, je veux créer un nouveau nom de variable qui sera "X" + nom de macro.

Par exemple, disons que je définis une macro "mois" qui a le mois en cours du système.

DECLARE @month AS VARCHAR(20);
SET @month = DATENAME(MONTH, GETDATE()), 3)

Lors de l'exécution, dites qu'il renvoie 'Nov'. Maintenant, plus loin dans le script, je veux exécuter une requête qui, basée sur CASE/WHEN, créera une nouvelle variable qui sera appelée quelque chose comme 'Product_Nov'. Lorsque j'utilise la requête mentionnée ci-dessous, ma sortie est une nouvelle colonne nommée "Product_ @ month" alors que je voulais "Product_Nov".

CASE
WHEN x ='Y' then 1
ELSE 0
END AS Product_@month

Toute aide/conseil/suggestion très appréciée.

2
T.H.

Je sorte de simuler des macros à l'aide de SQL dynamique, mais c'est assez maladroit car ce n'est pas pour cela que T-SQL a été conçu.

DECLARE @sql nvarchar(max) = N'SELECT foo_$alias$ = 1;';

DECLARE @alias sysname = N'bar';

SET @sql = REPLACE(@sql, N'$alias$', @alias);

EXEC sys.sp_executesql @sql;

Production:

foo_bar
-------
      1

Ma préoccupation serait que l'application consommatrice soit capable de gérer tous les noms de colonnes potentiels provenant de la base de données (je suppose que votre exemple réel est plus complexe, car l'application a certainement la capacité de connaître le mois en cours).

2
Aaron Bertrand

T-SQL ne peut pas être utilisé comme C/C++ et il n'y a pas de macros dans T-SQL qui fonctionnent comme ça. Si vous voulez des noms de colonnes dynamiques et une utilisation, alors je suggérerais SQL dynamique .

Ou, si vous voulez une vraie aventure, vous pouvez écrire des scripts sqlcmd qui pourraient le faire. Bien sûr, ils devraient être exécutés en utilisant sqlcmd , ou dans SSMS , mais cela vous permettrait techniquement de le faire.

1
user126897