UDF для вставки текстовой строки в каждую строку таблицы

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

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

UDF может принимать только одну переменную '@mytext'.

Можно предположить, что текстовая строка разделена одним пробелом и может содержать запятые или точки.

Например, «не беспокойтесь о неудачах, беспокойтесь о шансах, которые вы упустите, даже не попытавшись». потребуется вернуть таблицу с каждым словом в отдельной строке столбца без запятых или точек.

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

Любая помощь в этом будет очень признательна!

Основываясь на том, что я сказал до сих пор, вот мой далеко не полный код, с которым я не слишком уверен, как действовать

create function [dbo].[textConverter]
(
    @mytext nvarchar(max)
)
returns @text_string table
    (
        word nvarchar
    )
as
begin

set @mytext = replace(@mytext, 'what needs to be changed', 'what it needs to be changed too')

--insert string to table

end

ИЗМЕНИТЬ

Я проверил пару ссылок и обнаружил немного больше информации об этом, теперь у меня есть этот код. Однако он выходит с ошибкой. Пример, который был использован в статье, я нашел код на использованных номерах во вставке, так что, может быть, проблема в этом??

create function [dbo].[textConverter]
(
    @mytext varchar(max)
)
returns @text_string table
    (
        word nvarchar
    )
as
begin

--Change string to be seperated by commas
set @mytext = replace(@mytext, ' ', ',')
set @mytext = replace(@mytext, '.',',')

--Eliminate double commas
set @mytext = replace(@mytext, ',,', ',')

declare @name nvarchar(255)
declare @pos int

while CHARINDEX(',', @mytext) > 0
begin
select @pos = CHARINDEX(',', @mytext)
select @name = SUBSTRING(@mytext, 1, @pos-1)

insert into @text_string
select @name

select @mytext = SUBSTRING(@mytext, @pos+1, LEN(@mytext)-@pos)
end

insert into @text_string
select @mytext

return
end

--To use function
select * from dbo.textConverter('don’t worry about failures, worry about the chances you miss when you don’t even try.')

person James    schedule 28.08.2014    source источник
comment
ole.michelsen.dk/blog/split-string -to-table-using-transact-sql   -  person Donal    schedule 29.08.2014
comment
Какая СУБД? Ваш синтаксис похож на SQL-Server.   -  person Barmar    schedule 29.08.2014
comment
@Barmar Извините, я должен был упомянуть. Да, это SQL-сервер   -  person James    schedule 29.08.2014
comment
Вы искали? Вообще? sqlperformance.com/2012/07/t-sql-queries/split- строки   -  person Aaron Bertrand    schedule 29.08.2014


Ответы (2)


См. ответ ниже. Он не в полной форме, но может быть преобразован в определяемую пользователем функцию.

Declare @Sentence Varchar(max) = 'don’t worry about failures, worry about the chances you miss when you don’t even try.'
Set     @Sentence = Replace(Replace(Replace(Replace(@Sentence,',',' '),'.',' '),'  ',' '),'   ',' ')


Declare @e int = (Select Len(@Sentence) - Len(Replace(@Sentence,' ','')))
Declare @s int = 1
Declare @Result Table(id int identity(1,1),Words varchar(max))

--Select @s,@e
While @s <= @e
begin
    Insert into @Result
    Select Left(@Sentence,Charindex(' ',@Sentence,1)-1)

    Set @Sentence = Substring(@Sentence,Charindex(' ',@Sentence,1) + 1,Len(@Sentence) )

Set @s = @s + 1
End

Insert into @Result
Select @Sentence

Select * from @Result

Результат

----+-----------
id  |Words
----+-----------
1   |don’t
2   |worry
3   |about
4   |failures  
5   |worry
6   |about
7   |the
8   |chances
9   |you
10  |miss
11  |when
12  |you
13  |don’t
14  |even
15  |try 
----+-----------
person Jithin Shaji    schedule 29.08.2014

Я адаптировал часть кода с http://sqlperformance.com/2012/07/t-sql-queries/split-strings, так как моя ситуация означала, что разделитель нельзя было указать в качестве входных данных. Я мог использовать только для ввода, и это была текстовая строка. Таким образом, у меня сработало следующее:

create function [dbo].[textConverter]
( 
    @string nvarchar(max)
) 
returns @output table(splitdata nvarchar(max) 
) 
begin 

--Change string to be seperated by commas
set @string = replace(@string, ' ', ',')
set @string = replace(@string, '.',',')

--Eliminate double commas
set @string = replace(@string, ',,', ',')

    declare @start int, @end int
    select @start = 1, @end = charindex(',',@string)

    while @start < len(@string) + 1 
    begin
        if @end = 0
            set @end = len(@string) + 1

        insert into @output (splitdata)
        values(substring(@string, @start, @end - @start)) 
        set @start = @end + 1
        set @end = charindex(',', @string, @start)

    end
    return
end
person James    schedule 04.09.2014