2013-05-03 40 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 
    
相關問題