2013-05-03 42 views
-2

我必须将Excel数据插入到数据库中。 Excel数据的结构是如何在SQL Server中使用未知节点元素的XML文档?

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 

问题:在Excel工作表列的数目是未知的(最大200):1 。

我已将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; 

帮助SQLServer中使用Cursor赞赏

+0

您的所有列名。如果它是一个XML文件 - 为什么不是y ou使用'XML'数据类型? – 2013-05-03 12:50:35

+1

请参见:[SQL Server 2005中的XQuery简介](http://msdn.microsoft.com/zh-cn/library/ms345122%28v=sql.90%29.aspx) – 2013-05-03 12:55:00

+0

如果您发布了XML示例我相信有人可以想出一个查询来返回你想要的行。 – 2013-05-03 12:55:57

回答

1

这是可以做到。

  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, '[email protected]+', 3) WITH (xyz int)' 
        exec (@query) 
    
        FETCH NEXT FROM myCursor INTO @id 
    END 
    
相关问题