tsql,挑出价值对

时间:2009-08-31 23:30:44

标签: sql tsql

我有一个包含以下数据的列:

PersonId =“315618”LetterId =“43”MailingGroupId =“1”EntityId =“551723”trackedObjectId =“9538”EmailAddress =“myemailaddy@addy.com”

是否有任何好的,干净的tsql语法来获取551723(与EntityId相关的值)。我正在使用的Substring和Patindex的组合看起来非常笨拙。

4 个答案:

答案 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 =“

之后获取下一个双引号的patindex
declare @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))

)