有没有一种方法可以用string_split编写一个插入语句,该语句将忽略重复项?

时间:2019-07-19 12:30:19

标签: sql sql-server tsql split sql-insert

我正在尝试使用string_split命令将行插入表中。如果没有重复,它可以正常工作。但是,如果有重复项,则会出错。我想知道如何修改以下内容,以使其在已存在时跳过。

我已经尝试过像下面那样修改插入语句,但是如果遇到重复,它只会跳过整个插入语句。

BEGIN 
     IF NOT EXISTS (select * from table_a
         where column_a = @module
         and column_b in (select value from string_Split(@client_ids, ',')))
    BEGIN
        INSERT IGNORE INTO table_a (column_a, column_b)
        SELECT @module, value FROM string_Split(@client_ids, ',') 
    END
END

原始查询...

DECLARE @client_ids VARCHAR(1000);
SET @client_ids = '12345,12346,456789,789459' 
DECLARE @module int = 741852 

-- Insert statement
INSERT INTO table_a (column_a, column_b)
SELECT @module, value FROM string_Split(@client_ids, ',') 

希望可以帮助您澄清一下... table_a中有一堆客户端,其中许多客户端都附加有不同的模块。

即客户端123456将具有模块789,788,799,而客户端123455将具有模块789,788。

已经给我一个任务,给出了50个客户端模块799的列表。我只想更新尚未与该模块关联的客户端。我可以查询已经有列表的列表,然后使用excel或其他东西进行比较并删除列表,然后对没有列表的列表运行查询(我昨天做了一个快速解决方案),但是我希望有更好的方法一步一步完成所有工作。

1 个答案:

答案 0 :(得分:1)

您可以只使用SELECT DISTINCT

INSERT INTO table_a (column_a, column_b)
    SELECT DISTINCT @module, value
    FROM string_Split(@client_ids, ',') ;

编辑:

哦,您想防止在表中插入行。也使用NOT EXISTS。如果您仅检查value,则:

INSERT INTO table_a (column_a, column_b)
    SELECT DISTINCT @module, value
    FROM string_Split(@client_ids, ',') s
    WHERE NOT EXISTS (SELECT 1
                      FROM table_a a
                      WHERE @module = a.column_a AND
                            s.value = a.column_b
                     );