我想知道您是否遇到过类似于UPSERT概念的T-SQL命令?使用选项(1)或(2)执行INSERT | UPDATE操作似乎过于复杂且容易出错。
目的
为了确保所需的记录(在本例中为employee_id 1)是最新的,而不必本质上两次写入相同的查询。
语境
- 表名:员工
- 员工编号:具有主键,并且身份属性设置为true
选项
执行SQL UPDATE ...检查@@ rowcount = 0和@@ error = 0 ...根据需要执行SQL INSERT
- 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
- 缺点:更多的代码=更多的输入时间
- 缺点:更多代码=更多错误空间
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure “使用@@ rowcount更新”
- 执行一个SQL MERGE
- 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
- 缺点:更多的代码=更多的输入时间
- 缺点:更多代码=更多错误空间
http://technet.microsoft.com/zh-cn/library/bb510625.aspx “ T-SQL合并”
- 执行SQL UPSERT(功能不存在)
- 专家:您一次定义了数据与表的关系(让SQL Server担心它是INSERT还是UPDATE)
- 优点:更少的代码=更快的实现
- 优点:更少的代码=更低的概率
UPSERT示例
UPSERT雇员(employee_id,employee_number,job_title,first_name,middle_name,sname,modified_at)VALUES(1,'00 -124AB37','Manager','John','T','Smith',GetDate());
- 如果employee_id 1不存在:MS SQL执行INSERT语句
- 如果employee_id 1存在:执行MS SQL和UPDATE语句
MERGE
它简单,灵活,并且也是SQL Standard的一部分。MERGE
和其他UPSERT
实现的真正问题是潜在的锁升级甚至死锁,这与语法无关。
MERGE
SQL Server中实现的一个讽刺。