所以我正在尝试编写一个UDF,它将从字符串中提取特定的数据。
'random text here Task 1234 blah blah more text task 4567'
我想提取"任务1234和任务4567",并让它们像一样显示
'Task 1234, task 4567'
这是我到目前为止得到的,但似乎只能得到第一个任务或第二个任务,但不能同时得到。
Alter Function [dbo].[fn_GetTask](@strText VARCHAR(MAX))
RETURNS varchar(1000)
AS
BEGIN
while patindex('%Task%', @strText) > 0
BEGIN
SET @strText = substring(@strText, (CHARINDEX(substring(@strText, Patindex('%Task%', @strText) +4, 5), @strText, 5)),5)
end
RETURN @strText
END
这是漫长的一天。我觉得我错过了一些非常基本的东西。
ALTER Function [dbo].[fn_GetTask](@strText VARCHAR(MAX))
RETURNS varchar(1000)
AS
BEGIN
DECLARE @ReturnString VARCHAR(1000) = ''
WHILE PATINDEX('%Task%', @strText) > 0
BEGIN
DECLARE @FoundString VARCHAR(1000) = SUBSTRING(@strText,PATINDEX('%Task%',@strText),9)
IF (LEN(@ReturnString) > 0)
BEGIN
SET @ReturnString += ', '
END
SET @ReturnString += @FoundString
SET @strText = RIGHT(@strText,LEN(@strText) - PATINDEX('%' + @FoundString + '%',@StrText))
END
RETURN @ReturnString
END
正如我在while循环中提到的,在哪里重写字符串,在哪里搜索结果字符串。你没有一个机制来修剪原始字符串或跟踪你的进度。这里是一种方法,我使用了额外的变量,这样我就不必嵌套几次相同的语句。
如果您需要更多基于SET的解决方案,您可以如下搜索:
DECLARE @pattern nvarchar(MAX) = N'%task [0-9][0-9][0-9][0-9]%';
DECLARE @input nvarchar(MAX) = N'random text here Task 1212 blah blah more text task 4567';
WITH Src AS
(
SELECT
SUBSTRING(@input, PATINDEX(@pattern, @input), 9) Val,
STUFF(@input, 1, PATINDEX(@pattern, @input)+9, '') Txt
WHERE PATINDEX(@pattern, @input)>0
UNION ALL
SELECT
SUBSTRING(Txt, PATINDEX(@pattern, Txt), 9),
STUFF(Txt, 1, PATINDEX(@pattern, Txt)+9, '')
FROM Src
WHERE PATINDEX(@pattern, Txt)>0
)
SELECT STUFF((SELECT ', '+Val FROM Src FOR XML PATH('')), 1, 2, '')
使用以下代码并转换为函数
declare @str varchar(100)='random text here Task 1234 blah blah more text task 4567 random task 9556'
declare @gstr varchar(100)=''--for saving the output string
declare @flag int=1--to identify the pattern starting
declare @move int=1-- change start of the string
while PATINDEX('%Task%', substring(@str,@move,LEN(@str)))>0
begin
set @str=substring(@str,@move,LEN(@str))
set @flag= PATINDEX('%Task%', @str)
set @gstr= @gstr+','+SUBSTRING(@str, @flag,9)
set @move=@flag+9
end
select STUFF(@gstr,1,1,'')