我有一个要从Sql Server检索的记录ID列表。我正在试图弄清楚这样做最有效的方式。例如,在代码中我有这个:
var recordsToFind = new List<long>{ 12345, 12346, 45756, 42423 ... }
我想创建一个执行此操作的存储过程:
Select * From Puzzles where ID = {any of the integers passed in}
我知道有几个选项,比如表值参数,将列表转换为逗号分隔字符串并使用CharIndex,创建临时表并拆分字符串等...
什么是最好的方法,记住这将使用很多!
谢谢!
答案 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。希望这会有所帮助。