T-SQL获取名称存在多于1的SerializeValue

时间:2014-09-25 11:37:21

标签: sql-server tsql

我有以下序列化值:

Active=1&Time=19&Loops=2&looptype=loopcustom&CC=john@gmail.com&CC=joane@gmail.com&MyMessage=something

我怎样才能得到CC的值。 我的意思是将值john@gmail.com和joane@gmail.com分为2行或2个变量。

这方面的一个大问题是价值总是在变化, 例如,它可以有更多的CC值或其他参数。 序列化值是动态的,而不是静态的。

我尝试使用patindex等,但它不起作用,因为值并不总是相同。

有人有个主意吗?

2 个答案:

答案 0 :(得分:1)

我确定这可能不是最好的方法,但它有效(对于你的例子):

    DECLARE @x VARCHAR(1000) = 'Active=1&Time=19&Loops=2&looptype=loopcustom&CC=john@gmail.com&CC=joane@gmail.com&MyMessage=something'


WHILE CHARINDEX('CC',@x) <> 0  
BEGIN

    SELECT SUBSTRING(@X, 
              CHARINDEX('CC=',@X)+3,
              CHARINDEX('&',@X,CHARINDEX('CC=',@X)) - (CHARINDEX('CC=',@X)+3) ) 

    SELECT @x = SUBSTRING(@X,CHARINDEX('&',@X,CHARINDEX('CC=',@X)),LEN(@X))

END 

答案 1 :(得分:1)

将其转换为xml:

DECLARE @txt varchar(2000) = 'Active=1&Time=19&Loops=2&looptype=loopcustom&CC=john@gmail.com&CC=joane@gmail.com&MyMessage=something'

SELECT 
  STUFF(t.c.value('.', 'VARCHAR(2000)'), 1, 3, '')
FROM (
    SELECT x = CAST('<t>' + 
        REPLACE(@txt, '&', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c)
WHERE 
  t.c.value('.', 'VARCHAR(2000)') like 'CC=%'

结果:

john@gmail.com
joane@gmail.com