我有一个包含以下数据的列:
PersonId =“315618”LetterId =“43”MailingGroupId =“1”EntityId =“551723”trackedObjectId =“9538”EmailAddress =“myemailaddy@addy.com”
是否有任何好的,干净的tsql语法来获取551723(与EntityId相关的值)。我正在使用的Substring和Patindex的组合看起来非常笨拙。
答案 0 :(得分:3)
如果那是列中的文本,那么你将不得不在某个阶段使用子字符串。
declare @l_debug varchar(1000)
select @l_debug = 'PersonId="315618" LetterId="43" MailingGroupId="1" EntityId="551723" trackedObjectId="9538" EmailAddress="myemailaddy@addy.com"'
select substring(@l_debug, patindex('%EntityId="%', @l_debug)+ 10, 6)
如果您不知道EntityID可能有多长,那么您需要在EntityID =“
之后获取下一个双引号的patindexdeclare @l_debug varchar(1000), @l_sub varchar(100), @l_index2 numeric
select @l_debug = 'PersonId="315618" LetterId="43" MailingGroupId="1" EntityId="551723" trackedObjectId="9538" EmailAddress="myemailaddy@addy.com"'
select @l_sub = substring(@l_debug, patindex('%EntityId="%', @l_debug)+ 10 /*length of "entityid=""*/, char_length(@l_debug))
select @l_index2 = patindex('%"%', @l_sub)
select substring(@l_debug, patindex('%EntityId="%', @l_debug)+ 10, @l_index2 -1)
答案 1 :(得分:3)
这些字符串看起来就像元素的XML属性列表,因此您可以将其包装到XML元素中并使用xpath:
declare @t table (t nvarchar(max));
insert into @t (t) values (
N'PersonId="315618" LetterId="43" MailingGroupId="1"
EntityId="551723" trackedObjectId="9538"
EmailAddress="myemailaddy@addy.com"');
with xte as (
select cast(N'<x '+t+N'/>' as xml) as x from @t)
select
n.value(N'@PersonId', N'int') as PersonId
, n.value(N'@LetterId', N'int') as LetterId
, n.value(N'@EntityId', N'int') as EntityId
, n.value(N'@EmailAddress', N'varchar(256)') as EmailAddress
from xte
cross apply x.nodes(N'/x') t(n);
字符串操作取决于多种因素,尤其是字符串的大小和要解析的记录数,这是好还是坏。我对基于char索引的操作提供了简单而干净的xpath语法(代码更易于维护)。
答案 2 :(得分:1)
如果可能,请打破您的数据。规范化表或在列中存储XML(使用XML数据类型)而不是名称,值对。然后,您就可以使用SQL Server的全部功能和速度,或者至少能够发出XPath查询(假设SQL Server的版本相对较新)。
我知道这可能在短期内对你没有帮助,但这是一个努力的目标。 :)
答案 3 :(得分:0)
Substring(
Substring(EventArguments,PATINDEX('%EntityId%', EventArguments)+10,10),0,
PATINDEX('%"%', Substring(EventArguments,
PATINDEX('%EntityId%', EventArguments)+10,10))
)