2009-11-15 62 views
1

我加载包含成千上万行到.NET DataTable中的一个CSV文件看起来是这样的:从SQL数据库包含相同的ID作为.NET数据表记录如何选择记录

MyLocalDataTable SequenceNo, 等

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

MySQLBDTable IdentityID, SequenceNo, 等

的SequenceNo是我常用的领域。我想在MySQLBDTable上做一个SELECT,它只返回来自MyLocalDataTable的具有SequenceNo的行。我不知道如何做到这一点。我想避免使用数千个WHERE SequenceNo =子句的SELECT查询。

有没有一种简单而有效的方法来做到这一点?

回答

1

转储中的序列号值到一个临时表,包含的权利类型的只有一列,以保持的序列号的“临时”表。

如果您使用的是SQL Server,则可以使用批量插入来实现这一点,这非常快。

然后,执行使用该临时表中的一个连接或IN子句来查找数据库中现有行内容的SQL语句。

例如:

UPDATE yourtable 
SET does_exist = 1 
WHERE sequence_no IN (SELECT sequence_no FROM staging_table) 
+0

神奇。谢谢。我不确定.NET是否有任何花哨的工具在应用程序端执行此操作。临时表听起来很完美,我将实施此解决方案。 – Brett 2009-11-15 19:22:00

0

什么拉塞说一起去,你可以使用SQLBulkCopy做从本地数据表中批量插入直接到SQL Server。

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)