2012-08-01 76 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

相关问题