2012-08-01 72 views
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 

我可以設置臨時數據庫名稱動態,查詢是巨大的,所以我不希望使用EXEC SQL語法。 有什麼建議嗎?

+0

我會建議EXEC SQL,直到你poo-pood該想法:) – Randy 2012-08-01 20:33:42

+0

感謝編輯 - bluefeet。 @Randy,我說的查詢很龐大,我有大約60列,名字也很長。因此對於支持組來說,exec sql模式將很麻煩。 – 2012-08-02 17:36:57

回答

4

你應該能夠使用同義詞。

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 
+0

謝謝GreenLion,同義詞,它是:) – 2012-08-02 17:33:51

0

SQL Server不喜歡代替@variables數據庫名稱,模式或表,這可能是你所追求的,這樣的一種方式或其他你需要去動態sql路線通過使用EXEC。

在使用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 '[email protected]+'.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) 
+0

正如我所說的查詢是巨大的我有大約60列,名稱也很長。因此對於支持組來說,exec sql模式將很麻煩。 - – 2012-08-02 17:37:23

相關問題