【问题标题】:Is it possible to load this xml with sqlxmlbulkload?是否可以使用 sqlxmlbulkload 加载此 xml?
【发布时间】:2018-11-25 12:25:31
【问题描述】:

是否可以使用 sqlxmlbulkload 将类似的 xml 加载到这些表中? xml:

<?xml version="1.0" encoding="utf-8"?>
<a>
    <b>
    <code>1</code>
    <ds1>1.11</ds1>
    <ds1>1.12</ds1>
    <ds1>1.13</ds1>
    <ds2>2.11</ds2>
    </b>

    <b>
    <code>2</code>  
    <ds1>1.21</ds1>
    <ds1>1.22</ds1>
    <ds2>2.21</ds2>
    <ds2>2.22</ds2>
    </b>

    <b>
    <code>3</code>      
    <ds1>1.31</ds1>
    <ds2>2.31</ds2>
    <ds2>2.32</ds2>
    </b>

    <b>
    <code>4</code>      
    <ds2>2.41</ds2>
    </b>
</a>

Sql 服务器表:

Create table b
    ([_id_b] int identity(1,1) NOT NULL
    ,[code] nvarchar(10) NULL
    ,Constraint PK_b primary key clustered ([_id_b])
    )
;
Create table ds
    ([_id_ds] int identity(1,1) NOT NULL
    ,[_id_b] int NOT NULL
    ,[ds] nvarchar(10) NULL
    ,[type] smallint not null constraint cs_type check ([type] between 1 and 2)
    ,Constraint PK_ds primary key clustered ([_id_ds])
    )

对于 sqlxmlbulkload 的这个 xml,xsd 模式应该是什么? 这不是一个简单的问题! 注意,我需要将标签&lt;ds1&gt;&lt;ds2&gt;加载到一个表ds中,这些是多个标签。 有可能吗?

【问题讨论】:

    标签: sql-server xml xsd sqlxml


    【解决方案1】:

    通过以下语句,您将从 XML 中提取值。将此结果存储在您的表中应该相当简单:

    DECLARE @xml XML=
    '<a>
        <b>
        <code>1</code>
        <ds1>1.11</ds1>
        <ds1>1.12</ds1>
        <ds1>1.13</ds1>
        <ds2>2.11</ds2>
        </b>
    
        <b>
        <code>2</code>  
        <ds1>1.21</ds1>
        <ds1>1.22</ds1>
        <ds2>2.21</ds2>
        <ds2>2.22</ds2>
        </b>
    
        <b>
        <code>3</code>      
        <ds1>1.31</ds1>
        <ds2>2.31</ds2>
        <ds2>2.32</ds2>
        </b>
    
        <b>
        <code>4</code>      
        <ds2>2.41</ds2>
        </b>
    </a>';
    

    --查询

    SELECT A.b.value('(code/text())[1]','nvarchar(10)') AS b_code
          ,B.ds.value('text()[1]','decimal(10,4)') AS ds_value
          ,B.ds.value('local-name(.)','nvarchar(100)') AS NodeName
    FROM @xml.nodes('/a/b') AS A(b)
    CROSS APPLY A.b.nodes('*[substring(local-name(),1,2)="ds"]') AS B(ds)
    

    结果

    b   ds      NodeName
    1   1.1100  ds1
    1   1.1200  ds1
    1   1.1300  ds1
    1   2.1100  ds2
    2   1.2100  ds1
    2   1.2200  ds1
    2   2.2100  ds2
    2   2.2200  ds2
    3   1.3100  ds1
    3   2.3100  ds2
    3   2.3200  ds2
    4   2.4100  ds2
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多