SQL Server: поиск нескольких строковых значений с использованием списка через запятую - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь использовать STRING_SPLIT() для параметра, отправляемого в хранимую процедуру, для разделения списка строк, разделенных запятыми, и я хочу выполнять поиск по каждой из них, выбирая только уникальные записи из каждого поиска.

Грубое представление о том, что я пытаюсь:

PROCEDURE ListSearch 
    @stringList VARCHAR(500)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @t AS TABLE ([id] INT NOT NULL IDENTITY(1, 1), [value] VARCHAR(100));

    INSERT INTO @t([value])
        SELECT [Value] FROM STRING_SPLIT(@stringList, ',');

    DECLARE @i AS INT;

    SELECT @i = COUNT(*) FROM @t;

    DECLARE @j AS INT;
    SET @j = 1;

    WHILE (@j <= @i)
    BEGIN
        SELECT * 
        FROM dbo.Verses
        WHERE VerseContent LIKE '%' + CAST(@j AS VARCHAR(10)) + '%'

        --AND KEEP SEARCHING, KEEPING UNIQUES

        SET @j += 1;
    END
END
GO

1 Ответ

3 голосов
/ 10 июня 2019

У вас есть несколько неправильных вещей:

♦ Вы передаете переменную @stringList и просто используете ее для заполнения табличной переменной @t.

♦ Вы используетеWHILE цикл, который будет работать медленно, и он там вообще не нужен.

♦ Вы выбираете данные из dbo.Verses, но в столбце VerseContent, например, число, хранящееся в переменной @j,поэтому вы не будете искать в этой таблице в соответствии со значениями, сгенерированными SPLIT_STRING(), как вы думаете.

♦ Если вы посмотрите на синтаксис создания хранимой процедуры, вы обнаружите, что естьне надо AS BEGIN.См. CREATE PROCEDURE синтаксис.

Наконец, из того, что вы предоставляете, и из того, что я понимаю, вы пытаетесь сделать как

CREATE PROCEDURE dbo.ListSearch 
(  
  @stringList varchar(500)
)
AS
  SET NOCOUNT ON;

  SELECT V.*
  FROM STRING_SPLIT(@StringList, ',') Str
  JOIN dbo.Verses V
  ON V.VerseContent LIKE CONCAT('%', Str.Value, '%');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...