복붙노트

[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. ==============================

    1.일반적으로이 값의 쉼표로 구분 된 목록에 전달하는 것입니다, 당신의 저장 프로 시저 내에서 수행하는 방식은, 밖으로 목록을 구문 분석하고 다음 조인에 사용할 수있는 임시 테이블에 삽입합니다. 는 SQL 서버 2005, 이것은 필요가 배열을 유지하는 것을 매개 변수를 처리하기위한 표준 방법입니다.

    일반적으로이 값의 쉼표로 구분 된 목록에 전달하는 것입니다, 당신의 저장 프로 시저 내에서 수행하는 방식은, 밖으로 목록을 구문 분석하고 다음 조인에 사용할 수있는 임시 테이블에 삽입합니다. 는 SQL 서버 2005, 이것은 필요가 배열을 유지하는 것을 매개 변수를 처리하기위한 표준 방법입니다.

    다음은이 문제를 해결하는 다양한 방법에 대한 좋은 기사입니다 :

    는 SQL Server 저장 프로 시저에 대한 목록을 전달 / 배열

    그러나는 SQL 서버 2008, 우리는 마침내 먼저 사용자 정의 유형으로 테이블을 정의하여, 절차에 테이블 변수를 전달받을.

    이 문서에서 좋은의이 설명 (더 많은 2008 기능)이 있습니다 :

    새로운 T-SQL 프로그래밍 기능 소개는 SQL Server 2008의 특징

  2. ==============================

    2.당신은 SQL 2008로 그것은 매우 긴 밖에되지 않았습니다 수 있지만, 그것은 사용할 수 있습니다.

    당신은 SQL 2008로 그것은 매우 긴 밖에되지 않았습니다 수 있지만, 그것은 사용할 수 있습니다.

  3. ==============================

    3.로가 코멘트에 언급, ERLAND Sommarskog는 (연결된로 아래)이 주제에 대한 일련의 기사를 썼다. 기사는 매우 철저하고 참고 자료로 역할을 할 수 있습니다. 그들은 SQL 서버 (T-SQL), 특정 동안 언급 한 몇 가지 기법 수도 있습니다 (예 : XML 데이터 형식을 사용하는 등) 다른 RDBMS에 대한 작업 :

    로가 코멘트에 언급, ERLAND Sommarskog는 (연결된로 아래)이 주제에 대한 일련의 기사를 썼다. 기사는 매우 철저하고 참고 자료로 역할을 할 수 있습니다. 그들은 SQL 서버 (T-SQL), 특정 동안 언급 한 몇 가지 기법 수도 있습니다 (예 : XML 데이터 형식을 사용하는 등) 다른 RDBMS에 대한 작업 :

  4. ==============================

    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. ==============================

    5.아니. 매개 변수가 제 1 정규형을 순종 SQL 값처럼, 기본적으로 하나가 될 수 있습니다 ...

    아니. 매개 변수가 제 1 정규형을 순종 SQL 값처럼, 기본적으로 하나가 될 수 있습니다 ...

    당신이 아마 알고있는대로, SQL 문자열을 생성하는 위험한 사업이다 : 당신은 SQL 인젝션 공격에 자신을 개방 둡니다. GUID가의 선의와 당신이있는 거 다루는만큼 당신은 괜찮을해야하지만, 그렇지 않으면 당신은 당신의 입력을 정화해야 할 필요가있다.

  6. ==============================

    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로 제시 ????? 그들은 이미 거기! 나는 뭔가를 놓치고 있습니까?

  7. 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