복붙노트

[SQL] SQL의 IN 절에 SQL 매개 변수에 문자열 배열을 전달하는 방법

SQL

SQL의 IN 절에 SQL 매개 변수에 문자열 배열을 전달하는 방법

나는 복잡한 방법으로 일을 오전 로직.

난 그냥 저장 프로 시저에서이 쿼리를 실행해야합니다 :

select Sizes, SUM(Quantity)
from tbl_SizeBreakup
where (Brand=@brand)
  and (Combo in ('1','2')) ...

C 번호가에 콤보는 내가 사용하는 매개 변수 SQL에 통과해야합니다

DataSet dt = new DataSet();
cmd = new SqlCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "sp_Accessories";
cmd.Connection = con;

cmd.Parameters.AddRange(
    new SqlParameter[] {
        new SqlParameter("@Mode",mode),
        new SqlParameter("@Combo",combo),
    }}

그래서 나는 예상대로 작동 1 개 매개 변수를 전달하는 경우. I가 통과해야하는 콤보 문자열 [(문자열 배열)이다. 무엇이든 될 수있는 배열의 길이는 UI에서 사용자 선택에 의존한다.

내 질문은, 어떻게 ( "콤보 @", 콤보) 새로운 SqlParameter에에 문자열을 [] 전달하는 것입니다?

내 저장 프로 시저 ..

ALTER proc [dbo].[sp_Accessories]
(  
@Mode varchar(50)=null,
@id int=null,
@brand varchar(50)=null,
@department varchar(MAX)=null,
@season varchar(50)=null,
@groupname varchar(MAX)=null,
@styles varchar(50)=null,
@combo varchar(50)=null,
@combo_color nvarchar(max)=null,
)
as
if @Mode='getsizewise'
begin
select Sizes,SUM(Quantity) from tbl_SizeBreakup where (Brand=@brand) and (Department=@department) and (Season=@season) and (Group_Name=@groupname) and (Style=@styles) 
and (Combo_Color=@color) and (Total_Add_Qty='Total Quantity') Group By Sizes
end

해결법

  1. ==============================

    1.소개 : 영업 이익은 이미 답을 인정하더라도, 나는 내가 쇼에 대해 해요 접근 방식을 보라 때문에 더 나은 다음 하나 허용하고, 내 경험을 공유하고 더 좋을 거라 생각 했어요.

    소개 : 영업 이익은 이미 답을 인정하더라도, 나는 내가 쇼에 대해 해요 접근 방식을 보라 때문에 더 나은 다음 하나 허용하고, 내 경험을 공유하고 더 좋을 거라 생각 했어요.

    나는 SQL 서버 데이터베이스에 배열을 전달하는 가장 좋은 방법은 사용자 정의 테이블 형식과 C #의 DataTable을 사용하고 있는지 찾을 수 있습니다. 당신이 한 차원의 문자열 배열을 전달하고자하기 때문에 귀하의 경우에는, 그것은 매우 쉽습니다 :

    첫째로 당신은 당신의 데이터베이스의 사용자 정의 테이블 형식을 생성해야합니다 :

     CREATE TYPE dbo.StringArray As Table (
        StringItem varchar(50) -- you can use any length suited for your needs
    )
    

    그런 다음 당신은 당신의 C # 코드에서 데이터 테이블을 작성해야합니다 :

    DataTable dt = new DataTable();
    dt.Columns.Add("StringItem", typeof(System.String));
    

    그런 다음 매개 변수로이 데이터 유형을 허용하도록 저장 프로 시저를 변경합니다

    ALTER proc [dbo].[sp_Accessories]
    (  
    @Mode varchar(50)=null,
    @id int=null,
    @brand varchar(50)=null,
    @department varchar(MAX)=null,
    @season varchar(50)=null,
    @groupname varchar(MAX)=null,
    @styles varchar(50)=null,
    @combo dbo.StringArray Readonly=null, -- NOTE THIS CHANGE
    @combo_color nvarchar(max)=null,
    )
    as
    if @Mode='getsizewise'
    begin
    select Sizes,SUM(Quantity) from tbl_SizeBreakup where (Brand=@brand) and
    (Department=@department) and (Season=@season) and (Group_Name=@groupname) and (Style=@styles) 
    and (Combo_Color=@color) and (Total_Add_Qty='Total Quantity') 
    and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
    Group By Sizes
    end
    

    그런 다음 당신은 당신의 C # 코드에서 데이터 테이블에 문자열 배열을 변환해야합니다.

    foreach (string s in YourStringArray) {
        string[] temp = {s};
        dt.Rows.Add(temp);
    }
    

    저장 프로 시저에 대한 매개 변수로 DataTable에 추가 :

    System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
    sp.SqlDbType = SqlDbType.Structured;
    sp.Value = dt;
    sp.ParameterName = "@Combo";
    cmd.Parameters.Add(sp);
    

    빌드 및 실행됩니다.

    이 방법은 다음의 SQL 유저 정의 함수를 사용하여 우수한 성능을 가져야하고, 또한 다른 데이터 타입에 이용 될 수있다. 이 그것을 사용하는 가장 큰 이유 중 하나입니다 : 당신이 날짜의 배열을 전달해야하는 시나리오를 생각해이기 때문에이 방법으로 당신은 단순히 날짜의 뒤쪽으로 문자열로 변환하지 않고 날짜를 통과 할 수있는 동안 CSV 접근법은 날짜에 각각의 문자열을 변환하는 SQL이 필요합니다. 또한, 2 차원 배열 또는 사전을 전달할 수 있습니다, 당신이 할 일은 당신의 SQL 데이터베이스에 적절한 사용자 정의 데이터 형식을 만드는 것입니다.

    참고 : 코드를 직접 여기에 서면, 일부 오타가있을 수 있습니다.

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

    2.은 SP에서이 문자열이 쓸모가, '1,2,3',하지만 당신은 먼저이 함수를 작성, 테이블로 변환 할 수 있습니다 : 당신은 CSV의 목록 (쉼표로 구분 된 값) 전달할 수 있습니다 :

    은 SP에서이 문자열이 쓸모가, '1,2,3',하지만 당신은 먼저이 함수를 작성, 테이블로 변환 할 수 있습니다 : 당신은 CSV의 목록 (쉼표로 구분 된 값) 전달할 수 있습니다 :

    CREATE FUNCTION fun_CSV_to_Table
    (
    @pcsvList varchar(max)
    )
    RETURNS @tableWithValues table(theColumn varchar(100))
    AS
    BEGIN 
        DECLARE @pos INT
        WHILE CHARINDEX(',', @pcsvList) > 0
        BEGIN
         SELECT @pos  = CHARINDEX(',', @pcsvList)   
    
         INSERT INTO @tableWithValues   
         SELECT LTRIM(RTRIM(SUBSTRING(@pcsvList, 1, @pos-1)))
    
         SELECT @pcsvList = SUBSTRING(@pcsvList, @pos+1, LEN(@pcsvList)-@pos)
        END
        --Insert the last value.
        INSERT INTO @tableWithValues SELECT @pcsvList
    
        RETURN
    END
    GO
    

    그리고 당신은 그것을 사용할 수 있습니다 :

     SELECT SIZES, SUM(QUANTITY)
     FROM TBL_SIZEBREAKUP
     WHERE BRAND=@BRAND
     AND COMBO IN (select theColumn FROM dbo.fun_CSV_to_Table(@aList)) 
    
    /* @aList must be a csv: '1,2,3,...,n' */
    

    당신은 공백을 걱정해야한다.

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

    3.당신은 Parameters.AddWithValue를 (업데이트)를 사용할 수 있습니다 :

    당신은 Parameters.AddWithValue를 (업데이트)를 사용할 수 있습니다 :

    DataSet dt = new DataSet();
    cmd = new SqlCommand();
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.CommandText = "sp_Accessories";
    cmd.Connection = con;
    
    var parameterList = new StringBuilder();
    for (int i = 0; i < items.Length; i++)
    {
        parameterList.Append(items[i] + ",");
    }
    
    
    var parameters= parameters.ToString().TrimEnd(',');
    cmd.Parameters.AddWithValue("@Combo", parameters);
    cmd.Parameters.AddRange(
        new SqlParameter[] {
            new SqlParameter("@Mode",mode),
        }}
    
  4. from https://stackoverflow.com/questions/24879020/how-to-pass-string-array-in-sql-parameter-to-in-clause-in-sql by cc-by-sa and MIT license