如何从SQL Server表中读取XMLColumn的值

时间:2012-08-06 15:20:12

标签: sql-server xml xquery xquery-sql

我是SQL Server中xquery的新手。 这是 ReponseRecord 表中 ErrorXml 列中的值。这是ErrorXML列的示例数据。

ROW1:

<Data>
  <Error PropertyName="CaseDisplayID">
    <ErrorMessage Type="Database">Claim is not in awaiting reprice response state. Current case state is ** Closed (Cancelled) **</ErrorMessage>
  </Error>
</Data>

行2:

<Data><Error PropertyName="CaseDisplayID" /></Data>

ROW3:

<Data />

如果该属性存在,我想在此处读取错误的值。

2 个答案:

答案 0 :(得分:3)

使用.value从XML获取特定值,并检查节点/Data/Error是否存在.exist

select T.ErrorXML.value('(/Data/Error/@PropertyName)[1]', 'nvarchar(50)') as PropertyName,
       T.ErrorXML.value('(/Data/Error/ErrorMessage/@Type)[1]', 'nvarchar(50)') as ErrorType,
       T.ErrorXML.value('(/Data/Error/ErrorMessage)[1]', 'nvarchar(max)') as ErrorMessage
from ReponseRecord as T
where T.ErrorXML.exist('/Data/Error') = 1

结果:

PropertyName    ErrorType       ErrorMessage
--------------- --------------- ----------------------------------------------------------------------------------------------------
CaseDisplayID   Database        Claim is not in awaiting reprice response state. Current case state is ** Closed (Cancelled) **
CaseDisplayID   NULL            NULL

SE-Data

答案 1 :(得分:0)

看看这是否有帮助

•检查XML文档中是否存在某个XML节点:

SELECT xmlColumn.exist('declare namespace x="1"; (/x:ParentNode/x:ChildNode)') AS test
FROM dbo.Table
WHERE Column1=22

•查询XML数据:

SELECT xmlColumn.query('declare namespace x="1"; (/x:ParentNode/x:ChildNode)') AS test
FROM dbo.Table
WHERE Column1=22

我不认为在你的情况下你需要命名空间,在这种情况下只需删除它们

SELECT xmlColumn.exist('/ParentNode/ChildNode') AS test
FROM dbo.Table
WHERE Column1=22

抱歉,我没有任何删除示例,但是它的方法相同,你可以在这里查看,而不是“查询”或“存在”只需使用删除。您可以在此处查看更多信息http://msdn.microsoft.com/en-us/library/ms190254.aspx

干杯