SQL Server 2008 を使用して、動的 SQL を使用して内部結合の列名を指定したいと考えています。結合しようとしている 2 つのテーブルには、結合しようとしている列の名前が同じです。SQL Server が自然結合をサポートしていないことは知っています。その場合、動的 SQL は次のようになります。
DECLARE @join_columns AS NVARCHAR(100)
DECLARE @sql_1 AS NVARCHAR(4000)
SET @join_columns = 'Age, Gender'
SET @sql_1 = '
SELECT ' + @join_columns + ', table_1.Field_x , table_2.Field_y
FROM table_1 , table_2
NATURAL JOIN ON ' + @join_columns
EXECUTE sp_executesql @sql_1
SQL Server には自然な結合がないため、これは機能しないことがわかりました。それで、これを行うための次善の方法は何ですか?
ここに私が失敗したいくつかのことがあります:
動的な種類の句をトークン
@join_columns
化して形成する。WHERE table_1.<col_1> = table_2.<col_1> [AND...]
しかし、T-SQL には文字列のトークン化機能があるようには見えません。動的 SQL を使用して一時テーブルを作成し、それぞれ
temp_key
に のフィールドを連結した新しいキー列が含まれています@join_column
。これらを動的に連結するのが簡単であれば、最終的な結合は常にON #temp_table_1.temp_key = #temp_table_2.temp_key
. これを設定する 1 つの方法は、関数を使用してカンマをプラス記号REPLACE
に置き換えることです。@join_column
ここで遭遇した問題は、連結には非VARCHAR
列のキャストが必要だったことです。したがって、前もって列の型を知っておく必要があります。振り出しに戻ります。
@join_columns
理想的には、動的 SQLGROUP BY
句 の他の場所で使用しているため、カンマ区切りの文字列として保持したいと考えています。
上記の失敗したアプローチの1つが、私が見逃したものを使用して機能する可能性があります。または、より良い全体的なアプローチがあるかもしれません。
助言がありますか?
アップデート
解決策は、以下の @usr と @Karl の両方の投稿の組み合わせでした。@usr の提案を使用して、トークン化されたテーブル値の UDF を追跡しました (最終的にはこれを使用しました)。次に、@Karl のCOALESCE
例を使用して、結果のテーブルをWHERE
句に変換しました。また、私が遭遇した別の結合の問題については、@Karl の完全な例も使用しました。両方の投稿者に回答ステータスを提供できたらいいのにと思います-みんなありがとう!