【发布时间】:2016-08-30 14:08:52
【问题描述】:
目前我有一个使用游标的大存储过程,里面有两个合并语句。简而言之,我想从一张大桌子中填充两张桌子。
现在,我对 sql 很陌生,并且已经阅读了相当多的内容来扩展我的知识。在这项研究中,我遇到了许多主题,他们讨论了游标以及它们可能给出的性能问题。
当前的 SP(带光标)工作正常,但我一直在尝试使用不带光标的代码(其他 POV),这让我大吃一惊。
所以现在我被这段垃圾代码卡住了。我认为不可能按照我想要的方式去做,但是嘿,我可以试试。
错误:子查询返回超过 1 个值。当子查询跟随 =, !=, 时,这是不允许的
代码:
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
MAIL = (SELECT MAIL FROM STAGING_CONTACTS),
NAME = (SELECT NAME FROM STAGING_CONTACTS),
BRAND = (SELECT BRAND FROM STAGING_CONTACTS),
ID = (SELECT ID FROM STAGING_CONTACTS)
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES ((SELECT MAIL FROM STAGING_CONTACTS),
(SELECT NAME FROM STAGING_CONTACTS),
(SELECT BRAND FROM STAGING_CONTACTS),
(SELECT ID FROM STAGING_CONTACTS));
这是我拥有的两个合并语句之一,这是较小的一个。
欢迎任何反馈!
提前致谢:)
【问题讨论】:
-
Merge 是一个有缺陷的实现,当有潜在的数据问题时很难调试。我绝不会允许任何人在我们的生产数据库中使用它。最好使用更新语句后跟插入(顺序很重要)
标签: sql sql-server tsql merge