我已经“继承”了一段出色的 TSQL 代码,它可以做到这一点:
- 在游标上逐行循环。
- 游标包含表A中需要合并(Upserted)的数据
- 对于游标中的每个行循环,都会调用一个存储过程。过程:
- 如果表 A 中存在相应的行,则更新该行
- 如果这样的行不存在,则:
- 在不同的表 B 中插入单行。
- 获取新生成的 ID(比如它称为 IDB)
- 在表 A 中插入一行。表 A 插入需要一个 IDB(该字段不为空,它应该仅具有表 B 中的值,但没有 FK 约束)
显然这很糟糕(性能和优雅的原因)!
问题 起初,这看起来像是一个标准的 MERGE 用法。我试着做:
MERGE [dbo].[TableA] AS Target
USING <cursor data set as a select statement> as Src on target.IDA = Src.IDA
WHEN MATCHED
//update
WHEN NOT MATCHED
//insert <------ Fails because obviously a new IDB is required
还尝试了各种方法,例如 anested select that sends IDB on the OUTPUT
但它失败了,因为 IDB 是一个 PK。
其他类型的合并也失败了,例如:
MERGE Table A with <cursor data set as a select statement>
...
MERGE Table A with Table B
WHEN NOT MATCHED
//insert on Table A
WHEN NOT MATCHED
// Update Table B
有人对此有想法吗?从本质上讲,我认为如果我们概括问题将是:
Can I insert and return the PK in one statement that can be nested in other statements
提前感谢您的任何回复
乔治