Как получить разделенную строку с кавычками на каждый разделенный элемент на SQL Сервере? - PullRequest
0 голосов
/ 01 марта 2020

Как получить разделенную строку с кавычками на каждом элементе разделения на SQL Сервере? Я пробовал это

declare @departmentNames as varchar(max) = 'Account, hod'
--declare @departmentNames as varchar(max) = 'Account'+', '+'hod'
print @departmentNames

Я получаю такой результат => Account,hod

, но хочу вот так => 'Account', 'hod'

, чтобы я мог используйте его в

select * 
from tblDepartment 
where name in (select item from splitString(@departmentNames, ','))

Я знаю, если я использую целые числа со столбцом id, он будет работать нормально, т.е. => 1, 2, 3, 4, но я хочу попробовать это со строками.

Так есть кто-нибудь, кто может мне помочь с этим?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Сначала создайте эту функцию:

CREATE FUNCTION [dbo].[fn_Split]
     (@String varchar(8000), 
      @Delimiter varchar(50))          
RETURNS @temptable TABLE (items varchar(8000))          
AS
BEGIN
    /*  
    SELECT * FROM dbo.fn_Split('12345;thome', ';')  
    */          
    DECLARE @idx int          
    DECLARE @slice varchar(8000)          
    DECLARE @delimiterLength int  

    SET @delimiterLength = len(@Delimiter)  

    SELECT @idx = 1          

    IF LEN(@String) < 1 OR @String IS NULL
        RETURN

    WHILE @idx != 0          
    BEGIN
        SET @idx = CHARINDEX(@Delimiter, @String)          

        IF @idx != 0
            SET @slice = LEFT(@String, @idx - 1)          
        ELSE
            SET @slice = @String          

        IF (LEN(@slice) > 0)     
            INSERT INTO @temptable(Items) 
            VALUES (LTRIM(RTRIM(@slice)))

        SET @String = RIGHT(@String, LEN(@String) - @idx - @delimiterLength + 1)          
        IF LEN (@String) = 0 
             BREAK
    END

    RETURN
END

После создания этой функции вы можете протестировать ее с помощью запроса ниже.

Она разделяет слова с любым передаваемым вами разделителем

   select  items  from dbo.fn_Split('ACCOUNT ,HOD',',')
   select  items  from dbo.fn_Split('ACCOUNT ; HOD',';')

Затем передайте переменную и и используйте соединение с этой функцией.

Используйте псевдоним таблицы для простоты понимания

declare @departmentNames as varchar(max) = ('Account,     hod')

 select t.* 
 from tblDepartment t
 inner join 
     (Select items 
      from dbo.fn_Split (@departmentNames, ',')) A on t.name = A.items  

Я создаю temptable для тестирования, и этот запрос вернет вывод, как показано ниже

enter image description here

1 голос
/ 01 марта 2020

Вы можете использовать apply:

select td.*
from tblDepartment td cross apply
     <shema>.splitString(@departmentNames, ',') spt(item) -- add schema name 
where spt.item = td.name;

Если вы хотите сравнение строк, вы можете сделать конкатенацию.

Примечание: используйте имя схемы при вызове функции UDF.

...