2017-12-08 3 views
-1

절차는 변수IN 연산자의 내부 변수를 사용하는 방법 내가</p> <pre><code>string state = "AZ, CA, VA" </code></pre> <p>내가 내 저장하려면 저장 프로 시저에 쉼표로 구분 된 여러 값을 포함하는 변수를 전달합니다 C#에서 응용 프로그램을 작성하기 위해 노력하고있어

CREATE PROCEDURE usp_GetStateInfo 
@state varchar(2) 

SELECT * FROM StateTable WHERE state IN (@state) 

에서 각 상태에 대한 모든 데이터를 반환하지만 내가 오류가 내가 잘못 뭐하는 거지 '의 구문이 잘못되었습니다' 말을 얻을 수 위의 코드를 할 때 나는이 문제를 어떻게 해결할 수 있습니까?

+1

사용 따옴표 : " 'AZ', 'CA', 'VA'" – Odrai

+1

당신이있어 가정 말하는 SQL 서버 (T-SQL)? 프로 시저를 호출하기위한 현재 코드는 무엇입니까? –

+1

거기에 인터넷에 예제뿐만 아니라 SQL에 예약어'IN'를 사용하는 방법에 관해서는 당신이 Google 검색을 했어 ..? – MethodMan

답변

1

당신이 문에 대한 매개 변수로 여러 개의 입력을 사용할 수 없습니다 감사합니다. 이러한 쉼표로 구분 된 값을 SQL로 분할하여 테이블 변수를 만들고 해당 테이블 변수와 결합해야합니다.

당신은 분할 입력 문자열에 대한 기능을 만들 수 있습니다

: -

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_PutStringtoTableUnique]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[udf_PutStringtoTableUnique] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE function [dbo].[udf_PutStringtoTableUnique] 
(   
     @inputStr as varchar(max), 
     @delim nchar(1) = N','  
)  
returns @tbl table(ID int primary key)  
as  
BEGIN  

if @inputStr = '' or @inputStr is null 
return 

declare @tags nchar(2) 
set @tags = @delim + @delim; 

with tbl_for_csv as  
( 
select left(@inputStr + @tags,charindex(@delim,@inputStr + @tags) -1)as Col,  
right(@inputStr + @tags,len(@inputStr + @tags) - charindex(@delim,@inputStr + @tags)) as Str  
union all  
select left(Str,charindex(@delim,Str) - 1)as Col,  
right(Str,len(Str) - charindex(@delim,Str)) from tbl_for_csv  
where len(right(Str,len(Str) - charindex(@delim,Str))) > 0  
)  
insert into @tbl  
select distinct Col from tbl_for_csv  
option (maxrecursion 0)  

return 
END 

GO 

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

을 다음 절차에서이 같은 쓰기 : -

DECLARE @TempStates Table (StateName Varchar(2)) 

INSERT INTO @TempStates 
Select id from [dbo].[udf_PutStringtoTableUnique](@state, ',') 

    SELECT * FROM StateTable 
    INNER JOIN @TempStates temp ON state = temp.StateName 
+0

좋지만 번거로운 솔루션입니다. 나는 이것이 효과가있을 것이라고 확신하지만 UDF는 매우 느리다. – Grantly

+0

그것은 단순한 udf이고 많은 시간을 들이지 않을 것이다 ... 나는 부피가 큰 데이터에서도 똑같이 시도했다. – Raska

+0

그래, 무슨 뜻인지 안다면, 인라인으로 사용하지 않으면 받아 들일 수있다. 인라인으로 사용하면 (선택에서) 정말 속도가 느려질 수있다. – Grantly

1

IN 연산자는 값의 인라인 목록 수락 또는 select 성명 SQL에는 고유 유형 list 변수가 없습니다. 그리고 확실하게 varchar(2)은 작동하지 않습니다.

C#을 사용할 때 각 요소에 대해 저장 프로 시저를 호출하여 상태 목록을 반복하는 것이 좋습니다. 이 절차는 IN 대신 =을 사용하여 상태를 필터링합니다.

프로 시저에 쉼표로 구분 된 값의 문자열을 허용하려면 SQL 명령을 사용하여 문자열을 분할하고 각 값을 임시 테이블이나 테이블 변수에 삽입 한 다음 select 문을 사용해야합니다. IN을 사용하십시오.

T-SQL에서, 당신은 SQL Server에 대한 STRING_SPLIT()이 할 수있는 2016 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

SELECT * 
FROM StateTable 
WHERE state IN(
    SELECT value 
    FROM STRING_SPLIT(@states, ',')) 
+0

신난다, STRING_SPLIT을 (를) 지원하는 SQL 버전은 무엇입니까? BTW 이것은 우리 모두가 어느 시점에서 가지고 있었던 문제에 대한 매우 효과적인 대답입니다 ... – Grantly

+0

LOL 2016 .... 저는 여전히 2008을 사용하고 있습니다 ... 지원되는 경우 '95를 사용할 것입니다. – Grantly

+0

불행히도 String_Split 호환성 수준 130 이하에서만 사용 가능한 2016 년에 도입되었습니다. :( – Raska

관련 문제