批量插入IN(....)

时间:2014-07-14 15:16:53

标签: sql sql-server sql-server-2008 bulkinsert

我有一个逗号分隔的ID列表,我需要插入到表中,如:


Table Name: tblFilterUsers
-
- FilterUserID int (pk)
- FilterGroupID int
- UserID int

我看到的插图如下:

INSERT INTO [tblFilterUsers] (FilterGroupID,UserID)
    SELECT '10',UserID FROM [tblUsers] WHERE [UserID] IN (1,2,3........)

问题是以逗号分隔的列表包含超过80,000个ID,并且查询花费的时间太长而且超时。

是否有更简单,更快捷的方式将逗号分隔的ID列表插入到这样的表中?

由于

2 个答案:

答案 0 :(得分:0)

如果这是一次性的话,我通常会将数据输入到Excel中,这样我就需要数据。在MS SQL Studio管理中,右键单击表选择“编辑前200行”,然后从Excel复制数据的行/列,然后粘贴到MS SQL Studio管理中。

答案 1 :(得分:0)

经过长时间的搜索,我找到了解决问题的最佳方法。由于我无法利用SqlBulkCopy或编写SQL中的实际插入逻辑(如@ Gordon-Linoff建议的那样),我最终使用了一个聪明的存储过程,允许快速将逗号分隔值插入数据库。

这将80,000次插入所需的时间减少到6秒左右。


CREATE PROCEDURE unpack_with_manyselect
             @list      nvarchar(MAX),
             @tbl       varchar(30),
             @delimiter nchar(1) = ',' AS
DECLARE @sql nvarchar(MAX),
             @q1     char(1),
             @q2     char(2)
SELECT @q1 = char(39), @q2 = char(39) + char(39)
SELECT @sql = 'INSERT ' + @tbl + ' EXEC(' + @q1 + 'SELECT ' +
               replace(replace(@list, @q1 COLLATE Slovenian_BIN2, @q2 + @q2),
                       @delimiter COLLATE Slovenian_BIN2,
                       ' SELECT ') + @q1 + ')'
EXEC (@sql)

用法:

EXEC unpack_with_manyselect '9, 12, 27, 37','tblResults',','

在一篇很棒的文章中找到它,可以在这里找到: http://www.sommarskog.se/arrays-in-sql-2005.html#listtoselect