我已經「繼承」輝煌片的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 ... :) –