MS SQL基于列表执行多个更新

MS SQL基于列表执行多个更新,sql,sql-server,Sql,Sql Server,我的问题是我发现了如何修复数据库唯一的问题是每次执行一次都必须插入案例编号 在C语言中,如果MS SQL中有什么内容,我会使用某种字符串列表来处理损坏的记录 到目前为止,我的代码实现了一个可变的CaseNumber。我有一张桌子,上面有很多坏掉的案件编号记录。是否有一种方法可以对不同表的每个案例编号执行此操作 比如: 1.获取第一个案例编号并运行此脚本。 2.然后使用第二个脚本,再次运行此脚本,直到每个案例编号都已确定 任何想法请提前通知Thx 这里有几个不同的选择 -- This verion

我的问题是我发现了如何修复数据库唯一的问题是每次执行一次都必须插入案例编号

在C语言中,如果MS SQL中有什么内容,我会使用某种字符串列表来处理损坏的记录

到目前为止,我的代码实现了一个可变的CaseNumber。我有一张桌子,上面有很多坏掉的案件编号记录。是否有一种方法可以对不同表的每个案例编号执行此操作

比如: 1.获取第一个案例编号并运行此脚本。 2.然后使用第二个脚本,再次运行此脚本,直到每个案例编号都已确定

任何想法请提前通知Thx


这里有几个不同的选择

-- This verion will just "fix" everything that can be fixed.
UPDATE mt1 SET 
    mt1.FIELD2 = mtx.FIELD2                        
FROM
    dbo.myTable mt1
    CROSS APPLY (
        SELECT TOP (1)
            mt2.FIELD2
        FROM
            dbo.myTable mt2
        WHERE 
            mt1.IDFIELD = mt2.IDFIELD 
            AND mt2.FIELD2 IS NOT NULL
        ) mtx
WHERE 
    mt1.FIELD2 IS NULL;
如果出于任何原因,您不想一次性修复整个表。您可以仅限于您指定的内容

-- This version will works off the same principal but limits itself to only those values in the @CaseNumCSV parameter.
DECLARE @CaseNumCSV VARCHAR(8000) = '25615,25616,25617,25618,25619';

IF OBJECT_ID('tempdb..#CaseNum', 'U') IS NOT NULL 
BEGIN DROP TABLE #CaseNum; END;

CREATE TABLE #CaseNum (
    CaseNumber VARCHAR(50) NOT NULL,
    PRIMARY KEY (CaseNumber)
        WITH(IGNORE_DUP_KEY = ON) -- just in case the same CaseNumber is in the string multiple times.
    );
INSERT #CaseNum(CaseNumber)
SELECT 
    CaseNumber = dsk.Item
FROM
    dbo.DelimitedSplit8K(@CaseNumCSV, ',') dsk;
    -- a copy of DelimitedSplit8K can be found here: http://www.sqlservercentral.com/articles/Tally+Table/72993/

UPDATE mt1 SET 
    mt1.FIELD2 = mtx.FIELD2
FROM
    #CaseNum cn
    JOIN dbo.myTable mt1
        ON cn.CaseNumber = mt1.IDFIELD
    CROSS APPLY (
        SELECT TOP (1)
            mt2.FIELD2
        FROM
            dbo.myTable mt2
        WHERE 
            mt1.IDFIELD = mt2.IDFIELD 
            AND mt2.FIELD2 IS NOT NULL
        ) mtx
WHERE 
    mt1.FIELD2 IS NULL;

你的脚本有一些逻辑缺陷。第一名和第一名?根据定义,单行总是不同的。但在你的情况下,你有前1名,但没有订单,所以你不知道你会得到哪一行。您很可能在此处使用表值参数,并在一次传递中更新整个组。使用一次传递更新整个组?接收表值参数的单个update语句。然后你加入它。您不希望通过折磨行来执行此RBAR行。子查询中的myTable是否与主查询中的myTable不同?我看不出{myTable}是一样的。案例编号的表格看起来像ID=0,a值=123非常感谢Jason,我会尝试一下并给你回复。
-- This version will works off the same principal but limits itself to only those values in the @CaseNumCSV parameter.
DECLARE @CaseNumCSV VARCHAR(8000) = '25615,25616,25617,25618,25619';

IF OBJECT_ID('tempdb..#CaseNum', 'U') IS NOT NULL 
BEGIN DROP TABLE #CaseNum; END;

CREATE TABLE #CaseNum (
    CaseNumber VARCHAR(50) NOT NULL,
    PRIMARY KEY (CaseNumber)
        WITH(IGNORE_DUP_KEY = ON) -- just in case the same CaseNumber is in the string multiple times.
    );
INSERT #CaseNum(CaseNumber)
SELECT 
    CaseNumber = dsk.Item
FROM
    dbo.DelimitedSplit8K(@CaseNumCSV, ',') dsk;
    -- a copy of DelimitedSplit8K can be found here: http://www.sqlservercentral.com/articles/Tally+Table/72993/

UPDATE mt1 SET 
    mt1.FIELD2 = mtx.FIELD2
FROM
    #CaseNum cn
    JOIN dbo.myTable mt1
        ON cn.CaseNumber = mt1.IDFIELD
    CROSS APPLY (
        SELECT TOP (1)
            mt2.FIELD2
        FROM
            dbo.myTable mt2
        WHERE 
            mt1.IDFIELD = mt2.IDFIELD 
            AND mt2.FIELD2 IS NOT NULL
        ) mtx
WHERE 
    mt1.FIELD2 IS NULL;