1

ステージングデータベースからデータを取得し、宛先データベースで結合を行い、宛先テーブルでデータを挿入/更新するように見えるこのMonster SQlクエリがあります。

簡略化された形式は次のようになります

MERGE INTO SOURCEDB.SCHEMA.DESTIANTIONTABLE AS TARGET
USING (SELECT COLA, COLB, COLC FROM STAGEDB.SCHEMA.SOURCE A INNER JOIN SOURCEDB.Schema,TABLEA) AS SOURCE
ON TARGET.ID = SOURCE.ID
WHEN MATCHED THEN UPDATE--

WHEN NOT MATCHED INSERT

STAGING DB 名を動的に設定できますか?クエリが巨大なので、exec SQl 構文を使用したくありません。助言がありますか?

4

2 に答える 2

3

同義語を使用できるはずです。

DROP SYNONYM syn_a;
CREATE SYNONYM a FOR STAGEDB.SCHEMA.SOURCE;
DROP SYNONYM syn_b;
CREATE SYNONYM b FOR STAGEDB.SCHEMA.TABLEA;
DROP SYNONYM syn_target;
CREATE SYNONYM target FOR SOURCEDB.SCHEMA.DESTINATIONTABLE;

MERGE INTO syn_target as TARGET
USING (SELECT COLA, COLB, COLC FROM syn_a as A INNER JOIN syn_b as B
) AS SOURCE
ON TARGET.ID = SOURCE.ID
WHEN MATCHED THEN UPDATE--

WHEN NOT MATCHED INSERT
于 2012-08-01T21:00:37.963 に答える
0

Sql Server は、データベース名、スキーマ、またはテーブルを @variables で置き換えることを好まないため、いずれにしても、EXEC を使用して動的 SQL ルートに移動する必要があります。

nvarchar(max) データ型を使用する場合、Sql Server 2005 以降で非常に大きな SQL ステートメントを実行しても問題はありません。制限は、2Gb またはサーバー メモリの小さい方です。

Declare @Sql nvarchar(max)
set @Sql = '
MERGE INTO SOURCEDB.SCHEMA.DESTIANTIONTABLE AS TARGET
USING (SELECT COLA, COLB, COLC FROM '+@StageDB+'.SCHEMA.SOURCE A INNER JOIN SOURCEDB.Schema,TABLEA) AS SOURCE
ON TARGET.ID = SOURCE.ID
WHEN MATCHED THEN UPDATE--

WHEN NOT MATCHED INSERT ...
'
exec (@Sql)
于 2012-08-01T21:19:21.783 に答える