sql - 如何在 OUTER APPLY 查询中将 varchar 转换为 XML

标签 sql sql-server sql-server-2008 t-sql

给出以下示例 SQL,如果 XML 本身和 @t 表声明的两个 varchar(max) 声明实际上是 xml 字段,那么它将完美地工作类型。

DECLARE @x varchar(max) = '<?xml version="1.0" encoding="UTF-8"?>
<AuditTrail>
   <Action />
   <ActionDetail />
   <ChangesXML>
      <Details>
         <Object ObjectType="Data.Review_Extension" AuditType="Modified" FriendlyName="Review">
            <ObjectKeys>
               <ReviewExtID>21482283</ReviewExtID>
            </ObjectKeys>
            <Properties>
               <Property name="Document Type 01" FieldName="Document_Type_01" TemplateFieldID="644140" ReviewExtensionID="214822182" PropertyType="System.String">
                  <OldValue />
                  <NewValue><![CDATA[1145]]></NewValue>
               </Property>
               <Property name="Document Type 02" FieldName="Document_Type_02" TemplateFieldID="644141" ReviewExtensionID="21482283" PropertyType="System.String">
                  <OldValue />
                  <NewValue><![CDATA[123]]></NewValue>
               </Property>
            </Properties>
         </Object>
      </Details>
   </ChangesXML>
</AuditTrail>'

DECLARE @t TABLE (userid INT, [xml] varchar(max))
INSERT @t VALUES(1, @x)

SELECT t.userid, r.z.value('@FieldName', 'nvarchar(MAX)')
FROM @t t
OUTER APPLY t.xml.nodes('//Property') as r(z) 

如何修改此 SQL 底部的 SELECT 查询以将 [xml] 字段转换为 XML 字段类型,以便我可以使用 t.xml.nodes?

最佳答案

只需首先使用一个 OUTER APPLY 来强制 CAST:

SELECT t.userid, r.z.value('@FieldName', 'nvarchar(MAX)')
FROM @t t
OUTER APPLY (SELECT CAST(t.xml as xml) as realxml) s
OUTER APPLY s.realxml.nodes('//Property') as r(z) 

关于sql - 如何在 OUTER APPLY 查询中将 varchar 转换为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484279/

相关文章:

sql - 有条件地从一个表或另一表中选择

mysql - SQL 上的 MIN COUNT 错误代码 1248

sql - 将单个触发器应用于相同的表

sql - 'All' 时的情况

sql-server - 如何过滤单个数据库的 SQL Server 2008 Profiler 输出?

mysql - 转换sql中的日期格式?

mysql - 查询MySQL记录的变化

php - 在 Laravel Eloquent 中获取和过滤关系

mysql - 统计子类别和每个子类别中的广告mysql

sql - 试图获取去年的月份和日期,以及数据之前的年份