通过ADO.NET命令对象执行的多SQL语句

时间:2014-11-08 20:30:36

标签: c# sql-server ado.net

我需要更新表中的记录,但记录可能不存在,所以我需要插入记录。

下面是一个SQL语句,它通过首先尝试更新记录来完成我的目标,如果它不存在则执行插入。我想知道它是否可以直接通过ADO.NET命令对象执行,还是需要进入存储过程。

UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX;
IF @@ROWCOUNT=0
  INSERT INTO MyTable (CustomerNumber , ReservationDate) 
  VALUES (@CustomerNumber , @ReservationDate)

如果我可以在没有存储过程的情况下通过命令对象执行它,则意味着对部署时间的依赖性降低(即部署存储过程)。

1 个答案:

答案 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。此联接的产品可以是MATCHEDNOT MATCHED,具体取决于TARGET表中先前存在的记录。查询的其余部分可能是自解释的,只需注意在两个操作(UPDATE和INSERT)中不需要重复MyTable名称(它是TARGET)

顺便说一下,是的,您可以将多个命令传递给以分号分隔的SqlCommand