3

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 の完全な例も使用しました。両方の投稿者に回答ステータスを提供できたらいいのにと思います-みんなありがとう!

4

2 に答える 2

1

これがうまく機能することがわかりました:

declare @whereClause varchar(8000)
declare @table2 varchar(255)
declare @table1 varchar(255)

set @table1='SomeTable'
set @table2 = 'SomeOtherTable'

SELECT  COLUMN_NAME as [joincolumn]
into    #join_columns
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME = @table1
AND COLUMN_NAME not in ('list names of columns that are not to be joined on here')

select @whereClause=coalesce(@whereClause+' and ','')+ 
'['+@table2+'].'+joincolumn+'=['+@table1+'].'+joincolumn +'
'
from #join_columns

print @whereClause

次に、動的 SQL スクリプトを作成し、その後ろに WHERE 句をタグ付けします。

于 2012-08-15T09:54:45.043 に答える
1

トークン化/分割機能をテーブル値の UDF にカプセル化します。これにより、動的 SQL 文字列をクリーンで構造的に健全な方法で構築できます。このような分割機能は、Web 上ですぐに利用できます。内蔵されていないのは残念ですが、自分で作ることができます。

于 2012-08-14T22:02:31.157 に答える