我有一个字符串看起来像'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,那就是结果:
因此IN子句不适用于此。关于如何做到这一点的任何想法?
答案 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,',')
)