如何从SQL DB中选择包含与.NET数据表记录相同的ID的记录

时间:2009-11-15 18:32:06

标签: .net sql datatable

我正在将包含数千行的CSV文件加载到.NET DataTable中,如下所示:

MyLocalDataTable SequenceNo, 等

我在SQL数据库中有一个表,我想根据我在CSV文件中找到的内容将记录拉到另一个数据表中。

MySQLBDTable   IdentityID,   SequenceNo,   等

SequenceNo是我的共同领域。我想在MySQLBDTable上做一个SELECT,只返回带有来自MyLocalDataTable的SequenceNo的行。我不知道该怎么做。我想避免使用数千个WHERE SequenceNo =子句的SELECT查询。

有一种简单而有效的方法吗?

3 个答案:

答案 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)