我可以构建单个批量SQL更新命令

时间:2013-10-08 08:53:09

标签: sql sql-server sql-update

我想对RDBMS表进行批量更新(通过JDBC从Java程序中),但我不知道如何在不为每条记录编写UPDATE语句的情况下实现它。

这是问题的大致轮廓。我有一个名为SUBS的表,其中包含以下列和示例数据:

ID (int), Type(bool), D1 (date), D2 (date), D3 (date)
1000, 1, 2013-08-31, 2013-10-31, 2013-10-31
1001, 0, 2013-10-31, NULL, NULL
1002, 0, 2013-11-30, NULL, NULL
…

根据Type为0或1,我要么只想更新D1,要么更新D2和D3。在我的程序中,我有一个数据结构,包括ID,类型和所需的新日期(D1-D3)。我可以轻松地遍历此数据结构并生成以下命令:

UPDATE SUBS SET D2 = “2014-01-31”, D3 = ‘2014-01-31’ WHERE ID = 1000
UPDATE SUBS SET D1 = “2013-12-31” WHERE ID = 1001
UPDATE SUBS SET D1 = “2014-01-31” WHERE ID = 1002

但是,有没有办法在单个SQL命令中执行此操作?或者也许两个命令,每个类型一个(0或1)?

1 个答案:

答案 0 :(得分:1)

假设您的新数据名为NEWSUBS,并且具有相同的表结构,那么我认为这就是您所追求的:

UPDATE S SET 
    D1 = CASE N.[Type] WHEN 0 THEN N.D1 ELSE S.D1 END,
    D2 = CASE N.[Type] WHEN 1 THEN N.D2 ELSE S.D2 END,
    D3 = CASE N.[Type] WHEN 1 THEN N.D3 ELSE S.D3 END
FROM    SUBS S
JOIN    NEWSUBS N
    ON  N.ID = S.ID
    AND N.[Type] = S.[Type]

基本上它只是更新SUBS与当前值(即没有变化)的应该未被感染的列

鉴于您的数据是本地的,根据评论,我可以看到的另一种方法是建立一个xml参数并传递它来进行更新,如下所示:

DECLARE @NEWSUBSXML xml

SELECT @NEWSUBSXML = '
<SUBS>
    <SUB>
        <ID>1000</ID>
        <TYPE>1</TYPE>
        <D>2014-01-31</D>
    </SUB>
    <SUB>
        <ID>1001</ID>
        <TYPE>0</TYPE>
        <D>2013-12-31</D>
    </SUB>
    <SUB>
        <ID>1002</ID>
        <TYPE>0</TYPE>
        <D>2014-01-31</D>
    </SUB>
</SUBS>' 



UPDATE S SET 
    D1 = CASE N.[Type] WHEN 0 THEN N.D ELSE S.D1 END,
    D2 = CASE N.[Type] WHEN 1 THEN N.D ELSE S.D2 END,
    D3 = CASE N.[Type] WHEN 1 THEN N.D ELSE S.D3 END
FROM    SUBS S
JOIN    
(       SELECT  ParamValues.ID.value('(ID)[1]','INT') AS [ID],
                ParamValues.ID.value('(TYPE)[1]','INT') AS [Type],
                ParamValues.ID.value('(D)[1]','DATE') AS [D]
        FROM    @NEWSUBSXML.nodes('/SUBS/SUB') as ParamValues(ID) 
) N
    ON  N.ID = S.ID
    AND N.[Type] = S.[Type]