基于值列表查询数据库的最有效方法是什么?

时间:2010-08-18 14:05:00

标签: tsql sql-server-2008

我有一个要从Sql Server检索的记录ID列表。我正在试图弄清楚这样做最有效的方式。例如,在代码中我有这个:

var recordsToFind = new List<long>{ 12345, 12346, 45756, 42423 ... }

我想创建一个执行此操作的存储过程:

Select * From Puzzles where ID = {any of the integers passed in}

我知道有几个选项,比如表值参数,将列表转换为逗号分隔字符串并使用CharIndex,创建临时表并拆分字符串等...

什么是最好的方法,记住这将使用很多!

谢谢!

3 个答案:

答案 0 :(得分:5)

有几个必须阅读的文章可以在这里找到:http://www.sommarskog.se/arrays-in-sql.html在这些文章中解决了性能问题。

答案 1 :(得分:0)

弥,

只是做简单的sql'in()'函数是不可能的? (显然你的数组被用作参数,而不是硬编码的值)

select * From Puzzles where ID in (12345, 12346, 45756, 42423)

也许我误解了你的问题:)

[编辑] - 我注意到这是在.net中使用的。是否有可能对数据库使用linq?如果是这样的话,那么一些精心设计的linq(例如通过EF或亚音速)方法可能会成功。例如:

var idlist =  new int[] { 12345, 12346, 45756, 42423 };
var puzzleids = Puzzles.Where(x =>
                       idlist.Contains(x.ID));

答案 2 :(得分:0)

您是否有能力更改代码和存储过程,或者您是否受到某些限制?如果你有能力改变它们,我之前已经看过这个:

//Convert array/list to a comma delimited string using your own function (We'll call string strFilter)
//Pass strFilter into stored procedure (varchar(1000) maybe, we'll call parameter @SQLFILTER)

DECLARE @SQL AS VARCHAR(2000) --Or VARCHAR(MAX)
SET @SQL = "SELECT * FROM PUZZLES WHERE ID IN (" + @SQLFILTER + ")"
EXEC (@SQL)

如果我的语法关闭,我道歉。不幸的是,我的工作使用的是Oracle,而且我在8个月内没有使用过SQL Server。希望这会有所帮助。