是否可以在不使用循环或最佳方式的情况下获取特定字符,'#image'和'#'中的所有子字符串
declare @str nvarchar(max)='get all substrings #image:header# #image:footer#'
图像
头
页脚
答案 0 :(得分:1)
get all substrings #image:header# #image:footer#
将#image:
替换为起始标记<X>
。
get all substrings <X>header# <X>footer#
将#
替换为结束标记</X>
get all substrings <X>header</X> <X>footer</X>
转换为XML并在X上粉碎。
declare @str nvarchar(max)='get all substrings #image:header# #image:footer#'
select T2.X.value('text()[1]', 'nvarchar(20)') as [image]
from (select cast(replace(replace((select @str for xml path('')), '#image:', '<X>'), '#', '</X>') as xml).query('.')) as T1(X)
cross apply T1.X.nodes('X') as T2(X)
结果:
image
--------------------
header
footer
答案 1 :(得分:0)
我从here获得了解决方案 通过递归使用CTE去除字符串
declare @str nvarchar(100)='get all substrings #image:header# #image:footer# between specific characters'
declare @imageTokenStart nvarchar(8)='#image:'
declare @imageTokenEnd nvarchar(1)='#'
;WITH cte(msg,token)
as
(
SELECT RIGHT(msg,(LEN(msg)- CHARINDEX(@imageTokenEnd, msg, CHARINDEX(@imageTokenStart, msg, 0) + 1)))
,SUBSTRING(msg, CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)
, CHARINDEX(@imageTokenEnd, msg, CHARINDEX(@imageTokenStart, msg, 0) + 1) - (
CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)))
FROM (SELECT @str as msg) tmp
WHERE CHARINDEX(@imageTokenStart,msg,0)>0
UNION ALL
SELECT RIGHT(msg,(LEN(msg)- CHARINDEX(@imageTokenEnd,msg,CHARINDEX(@imageTokenStart, msg, 0) + 1)))
,SUBSTRING(msg, CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)
, CHARINDEX(@imageTokenEnd, msg,
CHARINDEX(@imageTokenStart, msg, 0) + 1) - (CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)))
FROM cte
WHERE CHARINDEX(@imageTokenStart,msg,0)>0
)
SELECT token FROM cte
头
页脚