我有一个逗号分隔的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列表插入到这样的表中?
由于
答案 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