如何在SQL Server中使用带有未知节点元素的XML文档

本文关键字:节点 未知 元素 文档 XML SQL Server | 更新日期: 2023-09-27 18:12:03

我必须将Excel数据插入数据库。Excel数据的结构为

Service    General    SBI    BOB   
Luxury      300       300    250   
Apartment   200       200    150   
villa       500       400    300   

必须以这种格式发送到数据库

Service     Category    Rate
Luxury      General     300 
Luxury        SBI       300
Luxury        BOB       250
Apartment   General     200
Apartment     SBI       200
Apartment     BOB       150
villa       General     500
villa         SBI       400
villa         BOB       300

问题:1:Excel工作表中列数未知(最多200)

我已经将Excel工作表转换为XML文档,并将其作为参数传递给SQL Server。现在如何使用未知列是最大的问题。

如果以前有人这样做过,请简要说明如何做。xml是我的xmldocument,我把它传递给我的BillingConfig procedure

SqlCommand cmd = new SqlCommand("BillingConfig", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@info", SqlDbType.VarChar).Value = xml.InnerXml;

帮助欣赏

如何在SQL Server中使用带有未知节点元素的XML文档

这可以在SqlServer中使用Cursor来完成。

  1. 使用

    获取所有列名
    SELECT DISTINCT CAST(Attribute.Name.query('local-name(.)') AS VARCHAR(100))
    Columnname  FROM @xml.nodes('//@*') Attribute(Name)
    
  2. 验证列

  3. 应用游标将列转换为行

    DECLARE @id VARCHAR(10)
    declare @loc varchar(25)
    set @loc = '/MainItem/SubItem';
    declare @query varchar(max)        
    DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR
        SELECT * FROM @tempcolumnname
    OPEN myCursor
    FETCH NEXT FROM myCursor INTO @id
    WHILE @@FETCH_STATUS = 0 
    BEGIN
       set @query = 'SELECT * FROM OPENXML(@hdoc, '+@loc+', 3) WITH (xyz int)'
       exec (@query)
       FETCH NEXT FROM myCursor INTO @id
    END