使用SQL从表列解析XML

时间:2018-09-20 16:45:13

标签: sql sql-server xml

我有一个表,其中包含一个列标题为XML的数据。我需要从该列中提取一个字段,以便可以使用它连接到另一个表。我遇到的麻烦是当我设置XML变量时,因为我需要字段来自很多XML行。到目前为止,这是我的查询:

declare @XML as XML
set @XML = (select [Data] from tbl.api.Session where applicationid 
= 25)

select u.n.value('./@username', 'varchar(max)') as username
from @XML.nodes('/ISession/WorkbenchIdentity') as u (n)

任何帮助将不胜感激!让我知道您是否需要其他信息。

XML代码:

<ISession>
  <ad xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <adSessionGuid>ba07909a-46d3-4f79-a1b2-df4d267f66d5</adSessionGuid>
  </ad>
  <client-info xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <client-browser>Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; 
     WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET 
     CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)</client- 
     browser>
    <client-host-ip>172.16.108.8</client-host-ip>
    <res-width>0</res-width>
    <res-height>0</res-height>
  </client-info>
  <guest xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  <identity xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <id>c5a4ff78-fb49-4433-a9a1-d58b766100fb</id>
    <anonymous>false</anonymous>
    <lastAuthenticated>2018-09-15T00:05:48.3436442Z</lastAuthenticated>
    <guest>false</guest>
    <isTestSession>false</isTestSession>
  </identity>
  <WorkbenchIdentity xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <id>34193</id>
    <userId>c5a4ff78-fb49-4433-a9a1-d58b766100fb</userId>
    <userName>kwhittington250</userName>
    <lastAuthenticated>2018-09-15T00:05:48.3592653Z</lastAuthenticated>
    <storeId>5898</storeId>

2 个答案:

答案 0 :(得分:0)

我认为类似的东西应该起作用

select u.n.value('userName[1]','varchar(max)') as username
from tbl.api.Session s
    cross apply [Data].nodes('/ISession/WorkbenchIdentity') as u(n)
where applicationid = 25

不过,我认为[Data]字段必须已经是XML数据类型。如果不是,您可能必须将tbl.api.Session字段转换为XML的CTE或suquery替换[Data]

答案 1 :(得分:0)

我认为您可以忽略XML变量部分,如果您有多行,则可能会失败并返回错误。您可以直接查询表,并使用它来连接其他表。

Ex(假设“数据”字段为XML数据类型):

string(29) "{"max": 92233720368547758071}"
object(stdClass)#1 (1) {
  ["max"]=>
  float(9.2233720368548E+19)
}
object(stdClass)#1 (1) {
  ["max"]=>
  string(20) "92233720368547758071"
}
string(30) "{"max":"92233720368547758071"}"
string(29) "{"max":9.223372036854776e+19}"