Вставьте кавычки в каждое слово в строке, разделенной запятыми, и используйте в функции SQL - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть такая строка:

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

Есть идеи, как получить вывод с помощью функции?

Ответы [ 4 ]

2 голосов
/ 16 апреля 2019

Уже существует функция Table Valued, встроенная в SQL Server, начиная с SQL Server 2016. 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));
1 голос
/ 16 апреля 2019

Вы близки, но так как у вас теперь есть стол, вы можете использовать что-то вроде:

WHERE exists
   (select * from [FN_RPT_CommaSeperated] (@Values,',') where [string]=TD.CaseId)
0 голосов
/ 16 апреля 2019

Вам нужно небольшое изменение в вашей функции

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

0 голосов
/ 16 апреля 2019

Я немного изменил функцию и предложение WHERE в SP, чтобы получить ожидаемый результат.Это работает нормально.

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)**
...