Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Xquery将XML标记解析为列_Sql_Sql Server_Xml_Tsql_Xpath - Fatal编程技术网

Sql Xquery将XML标记解析为列

Sql Xquery将XML标记解析为列,sql,sql-server,xml,tsql,xpath,Sql,Sql Server,Xml,Tsql,Xpath,下面是一段XML,作为表SAYMyTable中XML列的一部分 <policystatusdetail id="XXXXXXXXXXXXXXX"> <CurrentUser>ABCDEFG</CurrentUser> <LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime> <PolicyStatus>Quote-New-Pending</

下面是一段XML,作为表SAYMyTable中XML列的一部分

<policystatusdetail id="XXXXXXXXXXXXXXX">
<CurrentUser>ABCDEFG</CurrentUser>
<LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
<PolicyStatus>Quote-New-Pending</PolicyStatus>
</policystatusdetail>
但它返回零行。有人能帮忙吗?

试试这个:

 DECLARE @xml XML='<policystatusdetail id="XXXXXXXXXXXXXXX">
                     <CurrentUser>ABCDEFG</CurrentUser>
                     <LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
                     <PolicyStatus>Quote-New-Pending</PolicyStatus>
                     </policystatusdetail><policystatusdetail id="XXXXXXXXXXXXXXX">
                     <CurrentUser>ABCDEFG</CurrentUser>
                     <LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
                     <PolicyStatus>Quote-New-Pending</PolicyStatus>
                     </policystatusdetail>'

   --Method 1.SELECT  s.b.value('PolicyStatus[1]','varchar(500)') FROM @xml.nodes('policystatusdetail') s(b)
   --Method 2.
   SELECT  s.b.value('.','varchar(500)') FROM @xml.nodes('policystatusdetail/PolicyStatus') s(b)
DECLARE@xml='xml'
ABCDEFG
2016-04-02T17:03:01.761
新报价待定
ABCDEFG
2016-04-02T17:03:01.761
新报价待定
'
--方法1.从@xml.nodes('policystatusdetail')s(b)中选择s.b.value('PolicyStatus[1]”,'varchar(500'))
--方法2。
从@xml.nodes('policystatusdetail/PolicyStatus')的(b)中选择s.b.value('.','varchar(500)')

有几个缺陷:

  • XML严格区分大小写。您的
    /policyStatusdetail
    无法找到

  • 您自己的查询显示,必须有更多节点:
    .nodes('session/data/policyAdmin/policyStatusdetail')

  • 您使用的
    CAST
    selectcast(xmldataasxml)
    )显示,此XML可能存储在非XML列中。实际的数据类型是什么

  • 我们不知道这个节点是否只发生一次。由于XML更大,显然可能会有更多的XML

如果您真的只需要第一次出现
,那么可以非常简单地做到这一点:

SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable

开头的
/
将触发深度搜索并找到具有给定名称的第一个元素…

这可能是case的问题。如果xml看起来像
policystatusdetail
,则需要查找节点
policystatusdetail
,而不是
policystatusdetail
。另外,
PolicyStatus[1]
,而不是
@PolicyStatus
。使用您当前使用的内容,它将在policystatusdetail节点中查找属性“PolicyStatus”(例如,要查找“id”,您将使用
@id
)。您好,柴坦尼亚,因为您是新来的(顺便说一句:欢迎!)请允许我一个提示:非常感谢您(您为此给出了答案),但这会更加友好,在(最佳)答案的投票计数器下方勾选接受检查。这将1)将此问题标记为已解决2)使追随者更容易找到最佳解决方案3)向回答者支付积分,4)向您支付积分。一旦你自己越过了15点的边界,你会被要求对捐款进行投票。这就是说谢谢的方式。快乐编码!
SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable