Singular Comma将字符串分隔为SQL Server中IN子句的多个字符串

时间:2016-05-24 15:48:29

标签: sql-server

我有一个字符串看起来像'NRT,STH,WST,EST,SCT'存储为可变参数以传递给存储过程。但是我想在IN子句中使用该参数,但显然这不起作用,所以我想把它拆开以便得到这个输出:

  

'NRT','STH','WST','EST','SCT'

应该是单数字符串。

我确信有一种方法可以做到这一点,在尝试在这里找到解决方案后谷歌我无法找到确切的解决方案(对不起,如果有一个已经在SO上)

我已经接近了,但我坚持使用后面有逗号的最后一个元素。

这是我到目前为止所拥有的

DECLARE @region NVARCHAR(MAX)
SET @region = 'NRT, STH, WST, EST, SCT'

Select *
From
    Table
Where 
    RegionId 
In (
    Select 
    Coalesce 
    (
     Case When @region = ''
     then Name
     Else 
     Name + ','
     End,''
     )
     From 
     dbo.splitstring(@region)
)

如果我自己使用split函数运行Coalesce,那就是结果:

  • NRT,
  • STH,
  • WST,
  • EST,
  • SCT,

因此IN子句不适用于此。关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

我希望你的splitstring函数将CSV值转换为Rows。请看下面的功能。

CREATE FUNCTION [dbo].[SplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

然后您可以使用下面的代码来检查传递给存储过程的多个值。

Select *
From
    Table
Where 
    RegionId IN
(
SELECT
  splitdata
FROM [dbo].[SplitString] (@Region,',')
)

答案 1 :(得分:1)

创建如下所示的功能

create  FUNCTION [dbo].[FunctionStringSplit](@stringname NVARCHAR(MAX),@separator nvarchar(1))
RETURNS TABLE
AS
RETURN
    WITH cte AS(
        SELECT CAST(0 AS BIGINT) AS FirstIndex,CHARINDEX(@separator,@stringname) charposition
        UNION ALL
        SELECT charposition+1,CHARINDEX(@separator,@stringname,charposition+1)
        FROM cte
        WHERE charposition>0
    )
    SELECT SUBSTRING(@stringname,FirstIndex,COALESCE(NULLIF(charposition,0),LEN(@stringname)+1)-FirstIndex) AS splitstring
    FROM cte

然后在你的select语句中调用该函数,如下所示

 Select *
From
    Table
Where 
    RegionId IN
(
SELECT
  splitstring
FROM [dbo].[FunctionStringSplit] (@Region,',')
)