[SQL] 그것은 ADO.NET SQL 매개 변수로 ID의 컬렉션을 보낼 수 있습니까?
SQL그것은 ADO.NET SQL 매개 변수로 ID의 컬렉션을 보낼 수 있습니까?
예. 이 코드 같은 것을 쓸 수 있습니다 :
public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
//...
myAdoCommand.CommandText =
"UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
//...
}
내가 아는 유일한 방법은 내 IEnumerable을 가입 한 후 내 SQL 문자열을 구축 할 문자열 연결을 사용하는 것입니다.
해결법
-
==============================
1.일반적으로이 값의 쉼표로 구분 된 목록에 전달하는 것입니다, 당신의 저장 프로 시저 내에서 수행하는 방식은, 밖으로 목록을 구문 분석하고 다음 조인에 사용할 수있는 임시 테이블에 삽입합니다. 는 SQL 서버 2005, 이것은 필요가 배열을 유지하는 것을 매개 변수를 처리하기위한 표준 방법입니다.
일반적으로이 값의 쉼표로 구분 된 목록에 전달하는 것입니다, 당신의 저장 프로 시저 내에서 수행하는 방식은, 밖으로 목록을 구문 분석하고 다음 조인에 사용할 수있는 임시 테이블에 삽입합니다. 는 SQL 서버 2005, 이것은 필요가 배열을 유지하는 것을 매개 변수를 처리하기위한 표준 방법입니다.
다음은이 문제를 해결하는 다양한 방법에 대한 좋은 기사입니다 :
는 SQL Server 저장 프로 시저에 대한 목록을 전달 / 배열
그러나는 SQL 서버 2008, 우리는 마침내 먼저 사용자 정의 유형으로 테이블을 정의하여, 절차에 테이블 변수를 전달받을.
이 문서에서 좋은의이 설명 (더 많은 2008 기능)이 있습니다 :
새로운 T-SQL 프로그래밍 기능 소개는 SQL Server 2008의 특징
-
==============================
2.당신은 SQL 2008로 그것은 매우 긴 밖에되지 않았습니다 수 있지만, 그것은 사용할 수 있습니다.
당신은 SQL 2008로 그것은 매우 긴 밖에되지 않았습니다 수 있지만, 그것은 사용할 수 있습니다.
-
==============================
3.로가 코멘트에 언급, ERLAND Sommarskog는 (연결된로 아래)이 주제에 대한 일련의 기사를 썼다. 기사는 매우 철저하고 참고 자료로 역할을 할 수 있습니다. 그들은 SQL 서버 (T-SQL), 특정 동안 언급 한 몇 가지 기법 수도 있습니다 (예 : XML 데이터 형식을 사용하는 등) 다른 RDBMS에 대한 작업 :
로가 코멘트에 언급, ERLAND Sommarskog는 (연결된로 아래)이 주제에 대한 일련의 기사를 썼다. 기사는 매우 철저하고 참고 자료로 역할을 할 수 있습니다. 그들은 SQL 서버 (T-SQL), 특정 동안 언급 한 몇 가지 기법 수도 있습니다 (예 : XML 데이터 형식을 사용하는 등) 다른 RDBMS에 대한 작업 :
-
==============================
4.당신은 유형 매개 변수 XML을 사용할 수 있습니다 :
당신은 유형 매개 변수 XML을 사용할 수 있습니다 :
CREATE PROCEDURE SelectByIdList(@productIds xml) AS DECLARE @Products TABLE (ID int) INSERT INTO @Products (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)') FROM @productIds.nodes('/Products/id') as ParamValues(ID) SELECT * FROM Products INNER JOIN @Products p ON Products.ProductID = p.ID
http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx
-
==============================
5.아니. 매개 변수가 제 1 정규형을 순종 SQL 값처럼, 기본적으로 하나가 될 수 있습니다 ...
아니. 매개 변수가 제 1 정규형을 순종 SQL 값처럼, 기본적으로 하나가 될 수 있습니다 ...
당신이 아마 알고있는대로, SQL 문자열을 생성하는 위험한 사업이다 : 당신은 SQL 인젝션 공격에 자신을 개방 둡니다. GUID가의 선의와 당신이있는 거 다루는만큼 당신은 괜찮을해야하지만, 그렇지 않으면 당신은 당신의 입력을 정화해야 할 필요가있다.
-
==============================
6.당신은 하나의 SQL 매개 변수로 목록을 전달할 수 없습니다. 당신은 할 수 string.Join ( '')와 같은 "0000-0000-0000-0000, 1111-1111-1111-1111"로 GUIDS 그러나 이것은 정말 데이터베이스 오버 헤드 및 차선에 높은 것이다. 그리고 당신은 하나의 연결된 동적 문으로 전체 문자열을 통과해야, 당신은 매개 변수로 추가 할 수 없습니다.
당신은 하나의 SQL 매개 변수로 목록을 전달할 수 없습니다. 당신은 할 수 string.Join ( '')와 같은 "0000-0000-0000-0000, 1111-1111-1111-1111"로 GUIDS 그러나 이것은 정말 데이터베이스 오버 헤드 및 차선에 높은 것이다. 그리고 당신은 하나의 연결된 동적 문으로 전체 문자열을 통과해야, 당신은 매개 변수로 추가 할 수 없습니다.
질문:
당신은 어디에서 비활성 고객을 대표 아이디의 목록을 얻고있다?
나의 제안은 조금 다르게 문제를 접근하는 것입니다. 데이터베이스에 모든 논리를 이동, 같은 :
Create procedure usp_DeactivateCustomers @inactive varchar(50) /*or whatever values are required to identify inactive customers*/ AS UPDATE Customer SET c.Active = 0 FROM Customer c JOIN tableB b ON c.CustomerID = b.CustomerID WHERE b.someField = @inactive
그리고 저장 프로 시저로 전화 :
public void InactiveCustomers(string inactive) { //... myAdoCommand.CommandText = "usp_DeactivateCustomers"; myAdoCommand.Parameters["@inactive"].Value = inactive; //... }
만약 데이터베이스의 GUID의 존재의 목록을 왜해야합니까 : 그들을 찾을; 일반적인 목록에 넣어; 언 와인드를 CSV / XML / 테이블 변수에 목록, 그냥 다시 돌아 DB로 제시 ????? 그들은 이미 거기! 나는 뭔가를 놓치고 있습니까?
from https://stackoverflow.com/questions/114504/is-it-possible-to-send-a-collection-of-ids-as-a-ado-net-sql-parameter by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 (TSQL) -이 병렬로 EXEC 문에 수 있습니까? (0) | 2020.05.04 |
---|---|
[SQL] 이 코드 방지 SQL 주입합니까? (0) | 2020.05.04 |
[SQL] 내부는 SQL 서버에 행 번호에 가입 할 방법 (0) | 2020.05.04 |
[SQL] MYSQL에서 하위 쿼리에서 LIMIT 키워드를 사용하는 대체 (0) | 2020.05.04 |
[SQL] SQL Server 2005의 ROW_NUMBER () ORDER BY없이 (0) | 2020.05.04 |