2013-12-09 3 views
2

아래의 코드는 매개 변수로 '기본 스트림'또는 '프리미엄'에서 작동하지만 아래에서 볼 수있는 것처럼 두 가지 모두 작동하도록하고 있지만 결과를 반환하지는 않습니다. 아래 코드를 어떻게 작동시킬 수 있습니까?쉼표로 SQL 매개 변수를 분할

declare @myParameter varchar(50) 
SET @myParameter = 'Main Stream , Premium' 


select * FROM sales 
where myCategory IN (@myParameter) 
+1

을이 문제와 다른 솔루션에 대한 자세한 설명은이 [SQL 서버 2005 배열 (HTTP를에 ERLAND Sommerskogs 링크를 체크 아웃 : // WWW. sommarskog.se/arrays-in-sql-2005.html#CSV) –

답변

2

당신은 당신은 임시 테이블이 저장 또는 IN의 cluase에서 사용할 수 중 하나

--Split 
DECLARE @textXML XML 
DECLARE @data NVARCHAR(MAX), 
     @delimiter NVARCHAR(5) 

SELECT @data = 'Main Stream , Premium', 
     @delimiter = ',' 

SELECT @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML) 
SELECT T.split.value('.', 'nvarchar(max)') AS data 
FROM @textXML.nodes('/d') T(split) 

뭔가를 시도 할 수 있습니다. @Hoy 주석

를 들어

당신은 nodes() Method (xml Data Type)

노드()는 관계형 데이터에 XML 데이터 유형 인스턴스를 파쇄 할 때 방법이 유용하다 볼 수 있었다. 이 새 행으로 매핑 될 노드를 식별 할 수 있습니다. 또한

는, 그런 다음 내가 another thread on SO에 유사한 문제에 대한 좋은 해결책을 발견

select * 
FROM sales 
where myCategory IN (
          SELECT T.split.value('.', 'nvarchar(max)') 
          FROM @textXML.nodes('/d') T(split) 
         ) 
+0

+1 매우 훌륭하고 매우 우아한 ... –

+0

안녕하세요, 코드를 이해하려고 노력하면서 시간을 보냈지 만 마지막 두 행의 모양을 이해할 수 없었습니다. 일하는 것, (T) 무엇입니까, 그 구문은 무엇입니까? 그 구문을 배우려면 무엇을해야합니까? 마지막으로 IN 절을 사용하여 코드를 사용하는 방법 – HOY

1

로 사용 coul xml Data Type Methods

를 보라.
기본적으로 구분 기호 (귀하의 경우 ',')를 사용하여 문자열 (귀하의 경우 @MyParameter)을 분할하는 기능을 사용합니다. 여기

당신이 함수를 호출하는 방법입니다

declare @myParameter varchar(50) 
SET @myParameter = 'Main Stream,Premium' 

--this table will hold delimited values 
DECLARE @ParsedTable TABLE 
( 
     [id] [int] NOT NULL, 
     [content] [nvarchar](50) NULL 
) 
    --Parsing @myParameter 
INSERT INTO @ParsedTable 
SELECT * from [dbo].[SplitString](@myParameter, ',') 
--SELECT * FROM @ParsedTable --This will show you the values... 
--run the query 
select * FROM sales 
where myCategory IN (SELECT content from @ParsedTable) 

을 그리고 여기 분할 기능을 만들기위한 코드입니다 :

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

/****** Object: UserDefinedFunction [dbo].[SplitString] Script Date: 11/04/2013 19:04:05 ******/ 
SET ANSI_NULLS ON 
go 

SET QUOTED_IDENTIFIER ON 
go 

CREATE FUNCTION [dbo].[SplitString] 
(
    -- Add the parameters for the function here 
    @StringToDelimit nvarchar(500), 
    @deliminator nvarchar(2) 
) 
RETURNS 
@ReturnTable TABLE 
(
    -- Add the column definitions for the TABLE variable here 
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [content] [nvarchar](50) NULL 
) 
AS 
BEGIN 
     Declare @delimitorIdx int 
     Declare @content varchar(50) 

     --initialize spaces 
     Select @delimitorIdx = charindex(@deliminator,@StringToDelimit,0) 
     While @delimitorIdx > 0 

     Begin 
      Select @content = substring(@StringToDelimit,0,charindex(@deliminator,@StringToDelimit,0)) 

      Insert Into @ReturnTable(content) 
      Select @content 

      Select @StringToDelimit = substring(@StringToDelimit,charindex(@deliminator,@StringToDelimit,0)+ 1,len(@StringToDelimit) - charindex(' ',@StringToDelimit,0)) 

      Select @delimitorIdx = charindex(@deliminator,@StringToDelimit,0) 
     end 

     If len(@StringToDelimit) > 0 
      Insert Into @ReturnTable 
      Select @StringToDelimit 

    RETURN 
END 

go 
2

시도 :

select id from dbo.split("24,25,26",','); 

그래서 당신이 필요 ~까지 :

,210

를 실행하여 데이터베이스의 분할 기능을 추가

Create FUNCTION [Split](@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (id varchar(8000))  
as  
    begin  
     declare @idx int  
     declare @slice varchar(8000)  

     select @idx = 1  
      if len(@String)<1 or @String is null return  

     while @idx!= 0  
     begin  
      set @idx = charindex(@Delimiter,@String)  
      if @idx!=0  
       set @slice = left(@String,@idx - 1)  
      else  
       set @slice = @String  

      if(len(@slice)>0) 
       insert into @temptable(id) values(@slice)  

      set @String = right(@String,len(@String) - @idx)  
      if len(@String) = 0 break  
     end 
    return  
    end 
    Go 
관련 문제