我在CSV文件中获得了一个大的用户ID列表(~50,000),我必须查询我们的MSSql 2008R2数据库以查找所有这些用户的详细信息(电子邮件地址等)。我怎么能这样做,因为为了进行连接,ID的来源不在表中?
我尝试将整个列表粘贴到查询编辑器中并将它们插入到临时表中以加入,但很快就在INSERT INTO
语法中遇到了1000行限制。
有更好的方法吗?我能想到is SELECT * FROM User WHERE UserId IN (..., ..., ...
的唯一选择似乎是非常低效的。
答案 0 :(得分:0)
评论太长了。
使用导入向导将它们插入到"临时"表。我把"临时"在引号中,因为它不在tempdb
。
50,000行有点长,一次插入一行。对于小型数据集,我会在Excel中打开CSV文件,并为每个文件创建一个单独的insert
语句:
insert into tempids(...) select X, Y, Z;
其中X
等是来自单元格的值。然后我创建表格并将这些insert
语句复制到SSMS工作室并运行它们。
答案 1 :(得分:0)
有了那么多记录,除了将它们加载到临时表中之外,你没有任何其他选择。有多种方法可以做到这一点,如果使用SQL Server 2005或更新版本,SSIS最明显。
但是如果您选择使用SSIS,您也可以使用SSIS查找转换直接查询数据库。基本上会发生以下情况:您在SSIS包中创建一个数据流任务,该任务读取CSV文件中的所有记录。顾名思义,Lookup组件随后用于从数据库表中查找数据流中每条记录的详细信息。然后可以将输出写入新的CSV文件或存储在另一个表中。
请注意,导入 - 导出向导实际上会在后台创建一个SSIS包,并可选择保存包文件,因此请使用它。
答案 2 :(得分:0)
如果您有权将文件直接复制到SQL Server,请使用批量复制。
中的一些优秀解释BULK
INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTest
GO
--Drop the table to clean up database.
DROP TABLE CSVTest
GO