2014-04-14 2 views
0

전달 된 매개 변수의 값에 따라 중첩 저장 프로 시저를 호출하는 저장 프로 시저를 작성하고 있습니다.저장 프로 시저의 매개 변수로 쉼표로 구분 된 문자열 전달

하위 프로 시저로 전달하려고하는 매개 변수 중 하나는 쉼표로 구분 된 값의 문자열입니다. 주 절차에서 varchar을 선언하고 설정하고 있습니다.

내 주요 저장 프로 시저는 다음과 같습니다

Declare @StatusString varchar(150) 
Set @StatusString = N'''OPEN,'',''CLOSED'',''PENDING''' 

이 매개 변수로 내 중첩 된 저장 프로 시저에 @Status 문자열 변수를 전달합니다.

그런 다음 내 중첩 된 저장 프로 시저, 그러나

select from table where table.column in (@StatusString) 

않습니다 나는 어떤 결과를 얻고 있지 않다. 매개 변수를 올바르게 전달하지 못하고 있거나 Select 문을 올바르게 작성하지 않은 것 같습니다. 내가 뭘 놓치고 있니?

+0

많은 후프를 통과하는 것이 가장 좋습니다. 문자열을 분할하는 단일 제네릭 함수를 작성하는 것은 일회성 비용입니다. 내 제안은 그 옵션과 함께 가서 행 번호를 전달하므로 함수에 의해 생성 된 두 개의 열을 가지게됩니다. – UnhandledExcepSean

+0

또한 컨트롤을 우회하는 것은 거의 모든 작업에서 큰 문제가되지 않습니다. 이러한 컨트롤은 이유가 있습니다. 이 농구를 해결할 수있는 유일한 방법은 문자열 연결을 통한 동적 SQL입니다. – UnhandledExcepSean

+0

심각하게 기능을 만들기위한 많은 작업이 아닙니다. http://stackoverflow.com/questions/13909859/insert-values-into-table-after-splitting-the-string – UnhandledExcepSean

답변

2

SQL의 문제는 문자열 내에서 쉼표를 사용하여 IN 절에서 구분 기호로 사용할 수 없다는 것입니다. I.E ''OPEN,'',''CLOSED'',''PENDING''은 단일 문자열이며 4 개의 필드가 아닙니다.

제가 알고있는 두 가지 방법 만 있습니다.

  1. 문자열을 허용하고 레코드 세트를 다시 가져 오는 테이블 값 함수를 만듭니다. 그런 다음 해당 레코드 집합을 임시 테이블에 공급하고 값에 대한 조인을 수행하거나 레코드 집합을 in 절 (I.E. WHERE column in (Select * from fn(@StatusString)))으로 사용할 수 있습니다.

  2. 사용자 지정 데이터 형식을 만들고 사용자 지정 데이터 형식을 저장 프로 시저에 전달하십시오.

위에 나열되지 않은 된 그 문자열 연결을주의하시기 바랍니다.

+0

질문 아래 내 의견보기 – UnhandledExcepSean

1
CREATE FUNCTION Split 
    (
     @delimited nvarchar(max), 
     @delimiter nvarchar(100) 
    ) RETURNS @t TABLE 
    (
    -- Id column can be commented out, not required for sql splitting string 
     id int identity(1,1), -- I use this column for numbering splitted parts 
     val nvarchar(max) 
    ) 
    AS 
    BEGIN 
     declare @xml xml 
     set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>' 

     insert into @t(val) 
     select 
     r.value('.','varchar(max)') as item 
     from @xml.nodes('//root/r') as records(r) 

     RETURN 
    END 
    GO 


    Declare @StatusString varchar(150) 
    Set @StatusString = N'OPEN,CLOSED,PENDING' 
--if you want them with quotes 
--Set @StatusString = N'''OPEN'',''CLOSED'',''PENDING''' 
    declare @t table (val nvarchar(100)) 
     insert into @t select * from dbo.split(@StatusString,',') 
    select from table where table.column in (select val from @t) 
관련 문제