我已经“继承”辉煌片的TSQL代码,这是否:复杂TSQL合并
- 循环行接一行上的光标。
- 光标包含表A中
- 需要被合并(Upserted)数据对于在光标存储的过程被称为每行循环。体proc:
- 如果表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
也试过各种方法,如一个nested 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
预先感谢任何答复
乔治
您可以合并到tableB中,并使用[技术这里](http://stackoverflow.com/q/5365629/73226)我想。 –
谢谢,看到了。它其实是个好主意。本质上,这个人将新生成的ID存储在临时变量中。与我所寻找的不一样(在1合并中完成整个过程),但它仍然是一个有趣的方法。感谢Martin。 – George
使用单词'upserted'+1 ... :) –