Каков наиболее эффективный способ запроса базы данных на основе списка значений? - PullRequest
1 голос
/ 18 августа 2010

У меня есть список идентификаторов записей, которые я хочу получить с Sql Server. Я пытаюсь понять, каким будет самый эффективный способ сделать это. Например, в коде у меня есть это:

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

Я хочу создать хранимый процесс, который делает это:

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

Я знаю, что есть несколько опций, таких как параметры табличных значений, преобразование списка в разделенную запятыми строку и использование CharIndex, создание временной таблицы и разбиение строки и т.д.

Какой наилучший подход, учитывая, что будет использоваться ОЧЕНЬ много!

Спасибо!

Ответы [ 3 ]

5 голосов
/ 18 августа 2010

Несколько статей об этом должны прочитать здесь: http://www.sommarskog.se/arrays-in-sql.html В этих статьях рассматриваются вопросы производительности.

0 голосов
/ 18 августа 2010

У вас есть возможность изменить код и хранимую процедуру, или вы ограничены какими-то ограничениями? Если у вас есть возможность изменить и то, и другое, я уже видел это:

//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, и я не очень часто использовал SQL Server за 8 месяцев. Надеюсь, это поможет.

0 голосов
/ 18 августа 2010

Мика,

не может быть и речи просто выполнить простую функцию sql 'in ()' ??(очевидно, что в качестве параметра используется ваш массив, а не жестко закодированные значения)

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

возможно, я неправильно понял вопрос:)

[ edit ] - я заметил, что это используется в .net.Можно ли вообще использовать linq против базы данных?если так, то несколько хорошо разработанных методов linq (например, над EF или дозвуковым) могут помочь.например:

var idlist =  new int[] { 12345, 12346, 45756, 42423 };
var puzzleids = Puzzles.Where(x =>
                       idlist.Contains(x.ID));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...