我在一个SQL表中工作,其中一串信息存储在每个高级对象的单个列/行中。此列存储有关它们包含的基础对象的信息,每个子对象由[Report] Report1 .... [Report] Report2 ...等标记表示。有很多底层对象和标签,我需要能够在[Report]标签之后仅提取值。
表格结构
| 1 | [报告]报告1 [日期] 1 [报告]报告2 [日期] 2 [报告]报告3 [日期] 2 |
| 2 | [报告]报告5 [日期] 1 [报告]报告8 [日期] 2 [报告]报告3 [日期] 2 |
| 3 | [报告] report1 [date] 1 [Report] report2 [date] 2 [Report] report2 [date] 2 |
我不知道如何做到这一点,虽然我可以使用CharIndex()和substring()来接收第一个[Report]标签及其后面的值,但我不知道如何从中获取所有值每一行。
选择子串(ObjectText,Charindex('[Report]',ObjectText),15)作为报告 来自ObjectTable
我无法控制数据在表中的存储方式,我个人不会在同一行存储这么长的无关信息。
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以尝试使用以下功能:
create function ftStringsBetween
(
@str varchar(1000),
@tagStart varchar(50),
@tagEnd varchar(50)
)
returns table as
return
with [10](N) as (select 1 union all select 1 union all select 1 union all select 1 union all select 1
union all select 1 union all select 1 union all select 1 union all select 1 union all select 1),
[1000](N) as (select 1 from [10] a, [10] b, [10] c),
v3(N) as (select top (isnull(datalength(@str), 0)) row_number() over (order by @@spid) from [1000]),
v4(N) as (select N + datalength(@tagStart) from v3 where charindex(@tagStart, @str, N) = N),
v5(N1, N2) as (select N, N2=isnull(nullif(charindex(@tagEnd, @str, N), 0), datalength(@str) + 1) from v4)
select Value = substring(@str, N1, N2-N1)
from v5
GO
您可以将其应用于您的数据:
select o.ObjectID, rtrim(ltrim(fsb.Value)) Report
from Objects o
outer apply ftStringsBetween(o.ObjectText, '[Report]', '[') fsb
它将导致:
ObjectID Report
----------- -----------
1 report1
1 report2
1 report3
2 report5
2 report8
2 report3
3 report1
3 report2
3 report2