Разбить строку на буквы, разделенные точкой (SQL) - PullRequest
0 голосов
/ 04 октября 2018

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

Так, например, я хочу, чтобы SP принял параметр DOG и вернул DOG

Я попытался использовать функцию STRING_SPLIT следующим образом:

select STRING_SPLIT(@myString, '')

, но это не такКажется, он не совместим с версией SQL, которую я использую (2014) (в сообщении об ошибке говорится, что это не распознанная функция).Даже если это сработало, я не уверен, как затем вставить полные остановки.

Кажется, должен быть простой способ сделать это, но я просто не могу его найти!

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Большое спасибо.

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Вы можете использовать простой цикл while с stuff:

declare @s       varchar(max) ='dog'
declare @counter int          = 0
declare @len     int          = len(@s)

while @counter < @len - 1
begin 
    set @s = stuff(@s, @len - @counter, 0, '.')
    set @counter = @counter + 1
end
select @s + '.' as result

Поскольку ваши входные данные представляют собой короткие строки, исполнения не должно быть большой проблемой: я протестировал это решение с 8000 символьной строкойи результат был возвращен мгновенно.

Результат:

enter image description here

0 голосов
/ 04 октября 2018

Сначала неправильно прочитал вопрос.Этот ответ использует NGRams8K, чтобы разбить параметр на символы, а затем FOR XML PATH, чтобы присоединить его обратно:

SELECT (SELECT token +'.'
        FROM dbo.NGrams8k('DOG',1)
        ORDER BY position
        FOR XML PATH(''))
0 голосов
/ 04 октября 2018

Нет встроенной функции для выполнения того, что вам нужно, но вы можете легко сделать это, используя простой цикл while.

Перебирайте каждый символ в строке и используйте CONCAT:

    DECLARE @InputString NVARCHAR(200);
    DECLARE @Seperator CHAR(1);
    DECLARE @OutputString NVARCHAR(MAX);
    DECLARE @Counter INT;

    SET @InputString = N'TestString';
    SET @Seperator = '.';

    SET @Counter = 1;
    WHILE @Counter <= LEN(@InputString)
        BEGIN
            SET @OutputString = CONCAT(
                                         @OutputString
                                       , SUBSTRING(@InputString, @Counter, 1)
                                       , @Seperator
                                     );
            SET @Counter = @Counter + 1;
        END;

    SELECT @OutputString;
0 голосов
/ 04 октября 2018

Если я хорошо понял, это лучший подход, который я могу придумать прямо сейчас, используя ответ на этот вопрос T-SQL разбить слово на символы

with cte as (
    select
        substring(a.b, v.number+1, 1) as col
        ,rn = ROW_NUMBER() over (order by (select 0))
    from (select 'DOG' b) a
    join master..spt_values v
        on v.number < len(a.b)
    where v.type = 'P'
)
select distinct
    STUFF((SELECT '.' + col FROM cte order by rn FOR XML PATH('')),1,1,'') as col
from cte
...