web-dev-qa-db-ja.com

SQLサーバーでマクロを定義する方法は?

SQLスクリプトでマクロを定義し、後で条件付きクエリに基づいて、 'X' +マクロ名になる新しい変数名を作成します。

たとえば、システムの現在の月を含むマクロ「month」を定義するとします。

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

実行すると、「Nov」を返すと言います。スクリプトのさらに先で、CASE/WHENに基づいて「Product_Nov」のような名前の新しい変数を作成するクエリを実行したいと思います。以下のクエリを使用すると、出力は「Product_ @ month」という名前の新しい列ですが、「Product_Nov」が必要でした。

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

ヘルプ/アドバイス/提案は大歓迎です。

2
T.H.

動的SQLを使用してマクロをある程度シミュレートしますが、これはT-SQLが設計されたものではないため、かなり不格好です。

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;

出力:

foo_bar
-------
      1

私の懸念は、消費するアプリケーションがデータベースから返される可能性のあるすべての列名を処理できることです(アプリケーションには確かに現在の月を認識できるため、実際の例はより複雑だと思います)。

2
Aaron Bertrand

T-SQLはC/C++のように使用することはできず、T-SQLのマクロのように機能するものはありません。動的な列名と使用法が必要な場合は、 動的SQL をお勧めします。

または、実際の冒険が必要な場合は、これを実行できるsqlcmdスクリプトを記述できます。もちろん、これらは sing sqlcmd または SSMSで を実行する必要がありますが、技術的にはこれを行うことができます。

1
user126897