【问题标题】:How to Insert Different XML Field values into table column如何将不同的 XML 字段值插入表列
【发布时间】:2014-10-31 07:59:29
【问题描述】:

我有一个如下所述的 xml,

Declare  @Message as xml

set @Message='<message>

            <body>
            <ID>1</ID>
            <setup_time>10</setup_time>
            <prod_cycle_time>10</prod_cycle_time>
            <unit>cas</unit>
            <Flag>NULL</Flag>
            <FillingPO>NULL</FillingPO>
            <PackAtCAN1>NULL</PackAtCAN1>
            </body>
            </message>'

我正在尝试使用下面的查询插入

INSERT into table(ID,Desc,Value)
  SELECT p.value('ID[1]','INT'),
         p.value('Desc[1]','NVARCHAR(50)'),
         p.value('Value[1]','NVARCHAR(40)')
  FROM  @message.nodes('/message/Body/') x(p)    

我想按照下面提到的格式插入上面的 XML 数据

ID     Desc              Value
1      setup_time        10
1      prod_cycle_time   10
1      unit              Case
1      Flag              NULL
1      FillingPO         NULL
1      PackAtCAN1        NULL

但我只能插入一条记录

【问题讨论】:

    标签: sql sql-server xml sql-server-2008


    【解决方案1】:

    您需要进行一些更改,首先是在节点函数中的body/ 之后添加通配符,以确保返回所有节点。然后在选择中value('.', ...) 获取值,local-name 获取元素名称,因此您的查询结果如下:

      SELECT p.value('../../ID[1]','INT'),
             p.value('local-name(.)','NVARCHAR(50)'),
             p.value('.','NVARCHAR(40)')
      FROM  @message.nodes('/message/body/*') x(p)    
    

    【讨论】:

    • 如果 1 标签位于 标签之上,则上述语句有效。但是如果 标签在 标签内,同样的事情就不起作用。 set @Message='11010casNULLNULLNULL'
    • 如果 ID 在 body 标签中,那么您只需要更改查找它的位置 - 例如p.value('ID[1]','INT')
    • 以上语句返回所有 xml 标记及其表格式的值。但是,如果我需要很少的值,那么如何 do.xml 字段,例如“setup_time,prod_cycle_time,unit”字段及其值。
    • 我不确定我理解你的意思。您能否发布一个包含您的输入和预期输出的新问题?谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多