【问题标题】:Parse non Xml string into Xml during Sql query在 Sql 查询期间将非 Xml 字符串解析为 Xml
【发布时间】:2015-06-15 01:48:48
【问题描述】:

假设我有这个数据子集。我需要做的就是将John | John | 20 作为我的输出。我遇到的主要问题是我的 XmlData 存储在 nvarchar(Max) 字段中,并且修复此问题的更新会破坏未知数量的其他应用程序(谈论大规模,所以我不能简单地修改表格设计)。

Name nvarchar(23) | XmlData (nvarchar(max)                             |
John              |<Personal><name>John</name><age>20</age></Personal> |
Suzy              |<Personal><name>Suzanne</name><age>24</age></Personal> |
etc...

到目前为止我尝试过的类似于以下内容,但失败了。

SELECT Name,
       [myTable].Value('(Personal[name ="name"]/value/text())[1]', 'nvarchar(100)') as 'XmlName',    
       [myTable].Value('(Personal[name ="age"]/value/text())[1]', 'nvarchar(100)') as 'XmlAge'
FROM [MyTable]

我怎样才能实现以下输出的目标?

Name | XmlName | XmlAge |
John | John    | 20     |
Suzy | Suzanne | 24     |
etc...

【问题讨论】:

    标签: sql-server xml tsql parsing select


    【解决方案1】:

    先将字段转换为 XML 类型,然后使用value() 方法:

    DECLARE @T TABLE (Name nvarchar(23), XmlData nvarchar(max));
    INSERT @T VALUES ('John', '<Personal><name>John</name><age>20</age></Personal>');
    
    SELECT Name,
           CAST(XmlData AS XML).value('(Personal/name)[1]', 'nvarchar(100)') AS 'XmlName',
           CAST(XmlData AS XML).value('(Personal/age)[1]', 'nvarchar(100)') AS 'XmlAge'
    FROM @T;
    

    【讨论】:

    • 这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多