这是使用分隔字符串拆分器的另一个选项。已经发布的 XML 方法是一个很好的方法,但这种方法不需要表变量。
这是作为内联表值函数创建的,它应该保持非常快的性能。
create function fn_getFirstNthSentence
(
@SearchedStr varchar(100)
, @Occurrence int
, @Delimiter char(1)
) returns table as return
with ParsedValues as
(
select Item
, ItemNumber
from dbo.DelimitedSplit8K(@SearchedStr, @Delimiter)
where ItemNumber <= @Occurrence
)
select top 1 ResultString = STUFF(
(
select @Delimiter + Item
from ParsedValues
order by ItemNumber
for xml path('')), 1,1, '') + @Delimiter
from ParsedValues
这也使用了 Jeff Moden 创建的分离器。它有一个功能,其他拆分器都没有...一列来指示值来自哪个位置。您可以在此处找到他的文章以及随后的讨论。http://www.sqlservercentral.com/articles/Tally+Table/72993/ http://www.sqlservercentral.com/articles/Tally+Table/72993/
然后如果你想执行它,你可以非常简单地做到这一点。
declare @String varchar(100) = 'hello world.It.is.raining.today.'
, @Num int = 3
, @Delimiter char(1) = '.'
;
select *
from fn_getFirstNthSentence(@String, @Num, @Delimiter)
如果您不喜欢 Jeff Moden 的分离器,您可以在这里找到其他几个选项。http://sqlperformance.com/2012/07/t-sql-queries/split-strings http://sqlperformance.com/2012/07/t-sql-queries/split-strings我不会在所有事情上都使用 Moden,但是当你需要保持解析值的顺序时,它就很棒了。
--EDIT--
以下是如何将其修改为标量函数而不是内联表值函数。我的偏好是保留 itvf,因为它们更快、更灵活。
create function fn_getFirstNthSentenceScalar
(
@SearchedStr varchar(100) = 'hello world.It.is.raining.today.this is after 5'
, @Occurrence int = 5
, @Delimiter char(1) = '.'
) returns varchar(max) as begin
declare @RetVal varchar(max);
with ParsedValues as
(
select Item
, ItemNumber
from dbo.DelimitedSplit8K(@SearchedStr, @Delimiter)
where ItemNumber <= @Occurrence
)
select top 1 @RetVal = STUFF(
(
select @Delimiter + Item
from ParsedValues
order by ItemNumber
for xml path('')), 1,1, '') + @Delimiter
from ParsedValues;
return @RetVal
end