2014-11-08 80 views
1

我需要更新表中的记录,但有可能记录不存在,所以我需要插入记录。通过ADO.NET命令对象执行多个SQL语句

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

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

如果我可以经由命令对象,而无需存储过程执行它这将意味着用于部署时间少一个依赖性(即部署存储过程)。

回答

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的只是一个字符串,你开始定义您的表(T)TARGET,然后您使用包含TARGET中主键字段值的参数构建一个名为SOURCE(S)的伪指令。现在这两张表是JOINED ON的字段CustomerNumber。此连接的产品可能是MATCHEDNOT MATCHED,具体取决于TARGET表中以前存在的记录。查询的其余部分可能是自我解释的,只需注意在两个操作(UPDATE和INSERT)中不需要重复MyTable名称(它是目标)

顺便说一句,是的,你可以传递多个以分号分隔的SqlCommand命令

+0

真棒答案和水晶般清晰的例子!我从来不知道“合并”命令。谢谢! – webworm 2014-11-08 21:55:22

+0

如果在确定更新/插入哪些记录时使用了更多的字段,这也可以工作吗?例如......如果它不仅仅是CustomerNumber,还有更新/插入预订时使用的VehicleNumber?就像客户拥有多辆车一样。 – webworm 2014-11-08 22:32:34

+1

为什么不能?只需准备适当的参数,使用它们来构建SOURCE表并调整JOIN以匹配/不匹配目标的主键。更新或插入如下 – Steve 2014-11-08 23:45:15