在 SQL Server 表中搜索值列表的最有效方法

Posted

技术标签:

【中文标题】在 SQL Server 表中搜索值列表的最有效方法【英文标题】:Most Efficient way of searching a List of values in an SQL Server table 【发布时间】:2015-08-19 23:05:32 【问题描述】:

我正在开发一个连接到 SQL Server 数据库的 C# Win-forms 应用程序。我有一种情况,我必须解析 Excel 工作表中的数据并搜索表所有列中的每个值。并在最后显示值匹配的表行。

现在我正在做的是

    我已将整个 Excel 工作表解析为 DataTable 我在 SQL Server 中有一个存储过程,它接受一个字符串输入并在表的所有列中搜索它,如果匹配则返回一行。 现在我将 Datatable 的每个值(从 Excel 表中提取)传递给存储过程进行搜索。

请指导我这是否是一种有效的方法,或者给我建议以有效地实现它。

【问题讨论】:

你在 excel 中只有一列吗?我的意思是你只会从 SQL 中的每一行 excel 中搜索一个值? 您能否向我们展示您的实际代码以便更好地理解? @MairajAhmad,不,我在 excel 表中有多个列 你将不得不在sql中搜索excel的每一列值? 您可以将整个数据表传递给 sql,而不是在 SQL 中,您可以在 SQL 中使用循环或游标来提取值并在表中搜索/ 【参考方案1】:

您可以使用Table Valued 参数,而不是在SQL 中,您可以在传递的表上使用cursorloop 并搜索SQL 表中的每一列。这是一个简单的例子。

在数据库中创建一个新的Tpye

CREATE TYPE [dbo].[SearchInDB] AS TABLE(
[Id] [int] NOT NULL
)

在 SP 中,您将从 C# 代码中传递此类型。你的 SP 会像这样收到它

ALTER PROCEDURE [dbo].[YourSPNameHere]  
@DataToSearch dbo.SearchInDB ReadOnly  
AS  
BEGIN  
--Your SP logic here
END

在您的代码中,您将创建一个DataTable 并用值填充数据表,然后像这样将其传递给 SP

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
//Add rows in datatable with values
DataRow dr = dt.NewRow();
dr["Id"] = 10;
dt.Rows.Add(dr);

//Now pass this table to SP as parameter
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DataToSearch"; 
parameter.SqlDbType = System.Data.SqlDbType.Structured; 
parameter.Value = dt;

注意

我只添加了一列,如果需要,您必须添加其他列。要从传递给 SP 的参数中获取值,您必须使用循环或使用游标。 Here 是另一个例子的链接

【讨论】:

【参考方案2】:

您可以使用SQL Server SSIS包,直接将excel导入数据库表,并可以在存储过程中使用循环或游标搜索表

【讨论】:

你能证明这是最有效的方法吗? 是的,而不是进行多个数据库调用,将立即导入 excel 文件。所以这是一种有效的方法。

以上是关于在 SQL Server 表中搜索值列表的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中检查逗号分隔字符串中是不是存在子字符串的最有效方法

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]

从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?

SQL Server 2005:删除优化

在巨大列表中查找/搜索的最有效方法(python)

使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空