【问题标题】:Insert quotation marks to each word in sql comma separated string and use in Function SQL为sql逗号分隔字符串中的每个单词插入引号并在Function SQL中使用
【发布时间】:2019-04-16 03:14:26
【问题描述】:

我有一个这样的字符串:

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

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

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

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')

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

【问题讨论】:

    标签: sql sql-server tsql stored-procedures sql-function


    【解决方案1】:

    自 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));
    

    【讨论】:

      【解决方案2】:

      你已经很接近了,但既然你现在有一张桌子,你可以使用类似的东西:

      WHERE exists
         (select * from [FN_RPT_CommaSeperated] (@Values,',') where [string]=TD.CaseId)
      

      【讨论】:

      • 我不明白 " where [string]=TD.CaseId" 部分在这里。为什么要使用?
      • 这里是什么 [string] ?
      • 这是您的函数返回的列的名称。
      • 当我再次使用它时,什么都没有返回。但是,如果我只使用这个总是返回所有 CaseId 的数据。 WHERE 存在(select * from [FN_RPT_CommaSeperated] (@Values,',')
      • 我设法使用您的建议和对函数的小改动来获取数据。
      【解决方案3】:

      我稍微更改了 SP 中的函数和 WHERE 子句,以获得预期的输出。这工作正常。

      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 
      **exists
      (select * from [FN_RPT_CommaSeperated_Kiosk] (@KioskId,',') where [String] = TD.CaseId)**
      

      【讨论】:

        【解决方案4】:

        你需要对你的功能做些小改动

        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
        

        使用VALUES ('' + @String + '') 而不是VALUES ('''' + @String + '''')

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-24
          • 2018-01-15
          • 2013-06-28
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          相关资源
          最近更新 更多