我需要更新表中的记录,但记录可能不存在,所以我需要插入记录。
下面是一个SQL语句,它通过首先尝试更新记录来完成我的目标,如果它不存在则执行插入。我想知道它是否可以直接通过ADO.NET命令对象执行,还是需要进入存储过程。
UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX;
IF @@ROWCOUNT=0
INSERT INTO MyTable (CustomerNumber , ReservationDate)
VALUES (@CustomerNumber , @ReservationDate)
如果我可以在没有存储过程的情况下通过命令对象执行它,则意味着对部署时间的依赖性降低(即部署存储过程)。
答案 0 :(得分:2)
T-SQL中的MERGE command仅适用于此场景
string cmdText = @"MERGE MyTable T
USING (SELECT @CustomerNumber As CustomerNumber) as S
ON T.CustomerNumber = S.CustomerNumber
WHEN MATCHED UPDATE SET ReservationDate = @ReservationDate
WHEN NOT MATCHED INSERT INTO (CustomerNumber , ReservationDate)
VALUES (@CustomerNumber , @ReservationDate)";
由于逐字符@
,只有一行文字包含在可读性方面更多行使用MERGE
开始定义TARGET
表(T),然后构建一个名为SOURCE
(S)的伪表,其参数包含主键字段的值目标。现在,这两个表格为JOINED ON
字段CustomerNumber
。此联接的产品可以是MATCHED
或NOT MATCHED
,具体取决于TARGET
表中先前存在的记录。查询的其余部分可能是自解释的,只需注意在两个操作(UPDATE和INSERT)中不需要重复MyTable名称(它是TARGET)
顺便说一下,是的,您可以将多个命令传递给以分号分隔的SqlCommand