我一直在高低寻找答案,我似乎无法找到任何指向正确方向的东西。
我需要创建一个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.')
答案 0 :(得分:1)
请参阅下面的答案,它不是完整的形状,但可以发展成用户定义的功能。
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
----+-----------
答案 1 :(得分:0)
我修改了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