2013-06-08 5 views
1

WHERE … IN @xs 절을 사용하여 매개 변수가있는 ADO.NET 쿼리를 만들려고합니다. 여기서 @xs은 가능한 한 연속되지 않는 값의 짧은 목록입니다 (예 : (2, 3, 5, 8, 13)). 이 작업을 수행 할 수 있습니까? 그렇다면 어떻게?WHERE ... IN @ xs`에서 @xs 매개 변수는 값 목록입니다. ADO.NET에서 지원됩니까?

이 작동하지 않습니다

int[] xs = { 2, 3, 5, 8, 13 }; // I've also tried using a List<int> instead 
var c = new System.Data.SqlClient.SqlCommand(); 
c.CommandText = "SELECT … FROM … WHERE … IN @xs"; 
c.Parameters.AddWithValue("@xs", xs); // throws ArgumentException due to `values` 

는 어느 쪽도 아니 System.Data.SqlDbType enum이나 System.Data.SqlTypes namespace의 유형이 시나리오가 지원됩니다 것을 제안합니다. 동적 SQL (문자열 연산을 사용하여 최종 SQL CommandText을 수동으로 작성)으로 되돌려 야합니까?

답변

1

당신은 SQL 서버 2008 이상을 사용하는 경우, 대안 "테이블 반환 매개 변수"를 사용할 수 있습니다. 여기에 더 많은 정보 : 수정에 대한 Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters

+0

올바르게 이해한다면, ** SQL Server 데이터베이스에서 사용자 정의 테이블 유형을 생성해야합니다. ('CREATE TYPE xsType AS TABLE (x INT)'), ** 2. ** 설정 매개 변수의 SqlDbType을 SqlDbType.Structured로, TypeName을 xsType으로, ** 3. ** 하나의 열로 구성된 테이블을 @xs로 만듭니다 (예 : IEnumerable 형태로). ** ** IN IN xs를'IN (SELECT x FROM @xs)'로 바꾼다. 올바른가? – stakx

+1

@stakx - 1. 그렇다. 2. 항상 TypeName을 설정할 필요는 없다. (msdn 링크) 3. 예, 또는 (IMO)가 더 간단한 DataTable을 사용할 수 있습니다 4. 예 : http://msdn.microsoft.com/en-us/library/bb675163.aspx –

1

이미 확인 했으므로 : 지원되지 않습니다.

int[] xs = { 2, 3, 5, 8, 13 }; 
var c = new System.Data.SqlClient.SqlCommand(); 
// this code assumes xs has always at least one item 
var s = new StringBuilder("SELECT … FROM … WHERE … IN (@xs0"); 
c.Parameters.AddWithValue("@xs0", xs[0]); 
for(int i = 1; i < xs.Length; i++) 
{ 
    s.AppendFormat(",@xs{0}", i); 
    c.Parameters.AddWithValue(String.Format("@xs{0}",i), xs[i]); 
} 
s.Append(")"); 
c.CommandText = s.ToString(): 
+0

@stakx의 TNX는, 그것은 분명히 내가 ("?이 지원됩니까") 내 실제 질문에 대한 명확한 답을주는 ... – rene

+0

일을이 물건을 컴파일하지 않은 한 받아 들인 대답은하지 않습니다. 어쨌든 코드는 다소 간단하고 제한이 적기 때문에 나는 다른 대답을 사용했다. 그럼에도 불구하고 작동하는 솔루션에 감사드립니다. – stakx

2

한 번에 매개 변수 하나를 구축해야합니다 :

int[] xs = { 2, 3, 5, 8, 13 }; 
var c = new SqlCommand(); 
var parameters = xs.Select((x, i) => string.Concat("@xs", i)).ToList(); 
for (var i = 0; i < xs.Count; i++) 
{ 
    c.Parameters.AddWithValue(parameters[i], xs[i]); 
} 

c.CommandText = string.Format(
    "SELECT ... FROM ... WHERE ... IN ({0})", 
    string.Join(", ", parameters) 
); 
+0

사용되는 구체적인 값의 조합이 몇 가지 밖에 없다고 가정한다면, 실제 값 대신에 @ xs0','@ xs1' 등의 여러 매개 변수를 사용하는 것이 유리합니까? – stakx

+0

예, 항상 매개 변수화 된 쿼리를 사용해야합니다. 정수를 사용하는 특정 예에서는 안전 할 수 있지만 그렇지 않으면 코드가 SQL 삽입에 취약 해집니다. –

+0

그래서 보안상의 이유로 성능이 아니라 SQL Server가 매개 변수화되지 않은 명령보다 매개 변수화 된 명령을 캐시 할 수 있다는 점을 이해합니다. 그건 내 질문에 대한 답변입니다. 감사! – stakx