首页 > 解决方案 > 为sql逗号分隔字符串中的每个单词插入引号并在Function SQL中使用

问题描述

我有一个这样的字符串:

@Values VARCHAR(1000)
SET @Values = 'one, two, three'

我想在WHERE带有运算符的子句中使用此字符串IN

为此,我使用下表值函数。

ALTER FUNCTION [dbo].[FN_RPT_CommaSeperated] 
    (@StringInput VARCHAR(8000), 
     @Delimiter NVARCHAR(1))
RETURNS @OutputTable TABLE ( [String] VARCHAR(10) )
AS
BEGIN
    DECLARE @String VARCHAR(10)

    WHILE LEN(@StringInput) > 0
    BEGIN
        SET @String = LEFT(@StringInput, 
                           ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringInput) - 1, -1),
                           LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringInput), 0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

        INSERT INTO @OutputTable ([String])
        VALUES ('''' + @String + '''')
    END

    RETURN
END

此函数以预期的方式返回值。但是我的存储过程仍然没有按预期提供数据。

在我使用的存储过程中是这样的:

  WHERE
      TD.CaseId IN (SELECT * FROM [FN_RPT_CommaSeperated] (@Values,','))

无论如何,当我在存储过程中硬编码这样的值时,它都会返回预期的输出。

WHERE
    TD.CaseId IN ('one', 'two', 'three')

任何想法如何使用该函数获取输出?

标签: sqlsql-servertsqlstored-proceduressql-function

解决方案


自 SQL Server 2016 以来,SQL Server 中已经内置了一个表值函数。String_Split

DECLARE @Values VARCHAR(1000)
SET @Values = 'one, two, three'
SELECT value FROM STRING_SPLIT(@Values, ',');

您可以执行以下操作:

WHERE
    TD.CaseId IN (SELECT value FROM STRING_SPLIT(@Values));

推荐阅读