2010-08-18 5 views
1

SQL Server에서 검색 할 레코드 ID 목록이 있습니다. 이 일을 가장 잘 수행하는 방법이 무엇인지 알아 내려고 노력 중입니다.값 목록을 기반으로 데이터베이스를 쿼리하는 가장 효율적인 방법은 무엇입니까?

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

내가이 수행하는 저장된 프로 시저를 만들려면 : 코드의 예를 들어 나는이 가지고

나는 목록을 변환과 같은 몇 가지 옵션, 테이블 값 매개 변수가하는로가 알고
Select * From Puzzles where ID = {any of the integers passed in} 

쉼표로 구분 된 문자열을 사용하고 CharIndex를 사용하여 임시 테이블을 만들고 문자열 등을 분할합니다.

이것은 가장 많이 사용되는 방법입니다.

감사합니다.

답변

5

여러 기사가이 기사를 읽어야합니다. 여기를 참조하십시오. http://www.sommarskog.se/arrays-in-sql.html 성능 고려 사항은 해당 기사에서 다룹니다.

+0

+1 링크입니다. 이 웹 사이트에는 SQL Server에 대한 몇 가지 흥미로운 기사가 ​​있습니다. – Giorgi

0

미가,

은 기능 '()에서'간단한 SQL을 할 수있는 질문에서 그것을 무엇입니까 ??

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)); 
+0

코드에서 값 목록을 전달해야합니다. 그들은 하드 코드되지 않으며, 나는 곧바로 SQL (또는 동적 SQL) – Micah

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) 

구문이 꺼져 있으면 사과드립니다. 내 일은 불행히도 오라클을 사용하며 8 개월 만에 SQL Server를 많이 사용하지 않았습니다. 희망이 도움이됩니다.

관련 문제