【问题标题】:Parsing out xml column(varchar) within a table which needs to create a view在需要创建视图的表中解析出 xml 列(varchar)
【发布时间】:2020-07-19 18:34:59
【问题描述】:
@xml =      N'<School>
    <Name>
        <Id>123456</ID>
    </Name>
    <Grade> 
        <FirstGrade>80</FirstGrade>
    </Grade> 
            </School>',

上面这部分是 Schooltable 中的一个 varchar 列,其中包含其他几个列。我只想解析包含xml并格式化为varchar的schooldataxml。

这是我尝试过的

create view school as

 select CAST(CAST(schooldataxml as nvarchar(max)) as XML).query('school/Name/Id') Col
    from schooltable

在这里,我尝试将其转换为 cast 语句,但它不会取出 html 标记。我也尝试过节点但没有成功

我收到了

<Id>123456</ID>

我想在我的新视图中为新列中的每一行获取此信息

123456 

请注意,我需要将每一行一一解析到我的新列中。所以下一个需要解析的值是不同的动态值。

【问题讨论】:

    标签: sql tsql sql-server-2012 xml-parsing


    【解决方案1】:

    欢迎来到 StackOverflow。

    注意这段代码:

    DECLARE @xml XML =
    N'<School>
        <Name>
            <ID>123456</ID>
        </Name>
        <Grade> 
            <FirstGrade>80</FirstGrade>
        </Grade> 
    </School>';
    
    SELECT @xml.query('/School/Name/ID'); --<< THIS
    SELECT @xml.query('(/School/Name/ID/text())[1]'); --<< NEEDS TO BE THIS
    SELECT @xml.value('(/School/Name/ID/text())[1]','VARCHAR(100)'); -- EVEN BETTER
    

    使用query,您需要在 XPath 表达式中指定节点类型;默认行为是返回一个 XML 节点。

    对于您正在做的事情,value 方法可能会产生更好的性能。

    对表:

    DECLARE @schooltable TABLE (schooldataxml XML);
    INSERT @schooltable VALUES(
    N'<School>
        <Name>
            <ID>123456</ID>
        </Name>
        <Grade> 
            <FirstGrade>80</FirstGrade>
        </Grade> 
    </School>'),(
    N'<School>
        <Name>
            <ID>555444</ID>
        </Name>
        <Grade> 
            <FirstGrade>90</FirstGrade>
        </Grade> 
    </School>');
    
    SELECT SomeId = s.schooldataxml.value('(/School/Name/ID/text())[1]','VARCHAR(100)')
    FROM   @schooltable AS s;
    

    返回:

    SomeId
    ----------
    123456
    555444
    

    【讨论】:

    • 谢谢.. 似乎 text () 可用于提取数据。
    猜你喜欢
    • 2020-07-25
    • 2012-12-11
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多