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 语法。有什么建议么?

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 回答