我正在将包含数千行的CSV文件加载到.NET DataTable中,如下所示:
MyLocalDataTable SequenceNo, 等
我在SQL数据库中有一个表,我想根据我在CSV文件中找到的内容将记录拉到另一个数据表中。
MySQLBDTable IdentityID, SequenceNo, 等
SequenceNo是我的共同领域。我想在MySQLBDTable上做一个SELECT,只返回带有来自MyLocalDataTable的SequenceNo的行。我不知道该怎么做。我想避免使用数千个WHERE SequenceNo =子句的SELECT查询。
有一种简单而有效的方法吗?
答案 0 :(得分:1)
将序列号值转储到临时表中,该临时表是一个“临时”表,只包含一列,用于保存序列号的正确类型。
如果您使用的是SQL Server,则可以使用批量插入执行此操作,这非常快。
然后,执行一个SQL语句,该语句使用该登台表的内容进行连接,或者使用IN子句查找数据库中的现有行。
例如:
UPDATE yourtable
SET does_exist = 1
WHERE sequence_no IN (SELECT sequence_no FROM staging_table)
答案 1 :(得分:0)
与Lasse所说的一样,您可以使用SQLBulkCopy从本地数据表直接批量插入SQL Server。
答案 2 :(得分:0)
您可以生成如下查询:
var numbers = localTable.Rows.Cast<DataRow>()
.Select(r => r.Field<string>("SequenceNo"))
.ToArray();
var queryTemplate = @"select * from MySQLBDTable where IdentityID in ({0})";
var queryText = string.Format(queryTemplate, numbers);
请注意,如果您的本地表格中有太多行,则可能会达到IN
中项目的限制 - 在这种情况下,请将您的查询更改为以下内容:
select * from MySQLBDTable where IdentityID in (1,2,3,4,5,6,7,8,9,10)
union
select * from MySQLBDTable where IdentityID in (11,12,13,14,15,16,17,18,19,20)