[SQL] SQL의 IN 절에 SQL 매개 변수에 문자열 배열을 전달하는 방법
SQLSQL의 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.소개 : 영업 이익은 이미 답을 인정하더라도, 나는 내가 쇼에 대해 해요 접근 방식을 보라 때문에 더 나은 다음 하나 허용하고, 내 경험을 공유하고 더 좋을 거라 생각 했어요.
소개 : 영업 이익은 이미 답을 인정하더라도, 나는 내가 쇼에 대해 해요 접근 방식을 보라 때문에 더 나은 다음 하나 허용하고, 내 경험을 공유하고 더 좋을 거라 생각 했어요.
나는 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.은 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.당신은 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), }}
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
'SQL' 카테고리의 다른 글
[SQL] 데이터베이스 테이블에서 클래스를 생성 (0) | 2020.05.17 |
---|---|
[SQL] 내가 어떻게 로컬 드라이브에 원격 SQL Server 데이터베이스 백업? (0) | 2020.05.17 |
[SQL] 같은 테이블의 SQL 서버에서 행에 해당하는 선택 (0) | 2020.05.17 |
[SQL] 내가 저장 프로 시저에서 SELECT 문에서 변수를 사용하여 열 이름을 통과해야하지만 난 동적 쿼리를 사용할 수 없습니다 (0) | 2020.05.17 |
[SQL] 기본 키 값과 외래 키하지 채우기 (0) | 2020.05.17 |