我的问题本质上很简单 - 查询数据库,并将输出写入一组文件 (~1000)。
我有一个 SQL 查询需要在 SQL Server 上从 C# 执行。查询非常简单,除了 IN 子句中的一个值。
例如,查询可能如下所示:
SELECT
ID, Name
FROM
MyTable
WHERE
SomeValue IN (/* list of values */)
值列表大约有 300 个字符串,每个字符串有 6 个字符。这些值最终将类似于(“A00001”、“A00002”等),并由应用程序的用户指定为输入。
我最初的想法是将查询构建为一个长字符串,并将每个值聚合在一起。然而,这似乎不是正确的方法,而且似乎容易出错。我的下一个想法是使用存储过程,但我不确定应该如何将数据传递给它。应该如何以一种可以可靠地传入数据的有效方式构建此查询?
我的另一个选择是从 SQL Server 中读取所有数据,然后在收到结果时在 C# 中过滤结果。但是,如果我这样做,我将获得大约 900 万条记录,这些记录似乎太多而无法作为数据集读入内存。因为我在解析 ~5000 条记录后写入文件,所以我不想在我仔细阅读接收到的数据时让数据读取器连接到数据库。
什么是最好的方法?
最佳答案
本系列文章详细讨论了该主题:
- Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters
- Arrays and Lists in SQL Server 2005 and Beyond When TVPs Do Not Cut it
- Arrays and Lists in SQL Server 2000 and Earlier
您应该从第一篇文章中推荐的方法开始,使用 Table Value Parameter .另请参阅 MSDN 用法文章:Table-Valued Parameters in SQL Server 2008 (ADO.NET) :
void SelectValuesOfInterest(IEnumerable<SqlDataRecord> valuesOfInterest)
SqlCommand cmd = new SqlCommand(@" SELECT
ID, Name
FROM
MyTable
WHERE
SomeValue IN (SELECT value FROM @tableValueParameter);"
, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
"@tableValueParameter", valuesOfInterest);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.MyTVPType";
using (SqlDataReader rdr = cmd.ExecuteReader ())
{
while rdr.Read() {...}
}
}
关于C# 和长 SQL Server 查询,正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069250/