C# 和长 SQL Server 查询,正确的方法是什么?

标签 c# sql-server stored-procedures sqldatareader

我的问题本质上很简单 - 查询数据库,并将输出写入一组文件 (~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 条记录后写入文件,所以我不想在我仔细阅读接收到的数据时让数据读取器连接到数据库。

什么是最好的方法?

最佳答案

本系列文章详细讨论了该主题:

您应该从第一篇文章中推荐的方法开始,使用 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/

相关文章:

c# - System.Net.Http.HttpClientExtensions 的使用不明确

c# - 创建多级 MemberExpression

sql - scope_identity 返回 null

sql - 如何进行数据透视并计算列平均值

Mysql过程插入临时表

php - 尝试使用 CodeIgniter 存储过程 'call'

c# - 使用 `using(...)` 实际上无用和/或低效?

sql-server - 批量插入返回错误 "Access is denied"

MySQL:计算过程返回的行数

c# - 在多边形中查找点