2008-10-30 69 views
4

有時您需要升級包含數據表中許多行的數據庫,或者您需要有一個數組充滿數據,而不是將所有這些數據放在一個字符串中,然後在SQL SERVER中拆分,或者不是迭代數據表在逐行和更新數據庫的代碼行中,有沒有其他方法?除SQL SERVER 2005中的傳統變量外,還有其他類型的變量嗎?如何將諸如數組/數據表的變量傳遞給SQL服務器?

回答

4

有幾種方法可以做到這一點。

如果你只是簡單的插入行,那麼我會創建一個含有信息的DataTable對象,然後使用SqlBulkCopy的對象:

SqlBulkCopy copier = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default); 
copier.BatchSize = 500; //# of rows to insert at a time 
copier.DestinationTableName = "dbo.MyTable"; 
copier.WriteToServer(myDataTable); 

另一種選擇是包裝在XML數據(無論你想要做到這一點),並使用sql 2005'xml'數據類型將其發送到您的存儲過程(可以做任何您需要的操作)

6

我同意John的說法SqlBulkCopy或sqlxml是SQL中的最佳選項Server 2005;請注意,在SQL Server 2008中,您也有table valued parameters,這值得考慮;特別是當與新的merge join混合時。

請注意,如果您使用SqlBulkCopy,我強烈建議僅批量插入到臨時表 - 即僅用於導入的單獨表;然後運行存儲過程將數據移動到活動表。這樣,您可以正確地進行日誌記錄,並且您可以在運行SP時在數據庫中擁有一個緊密範圍的事務(即,您不需要跨越所有網絡IO的事務)。

另一點;如果您正在處理大量數據,則可能不需要加載DataTable(因爲這會迫使您先將所有數據緩存在內存中);作爲替代方案,也可以編寫自己的IDataReader來從流(如文件等)中提取數據。見SimpleDataReaderhereSqlBulkCopy將非常高興地接受來自IDataReader的數據。

2

約翰提到使用XML ...這就是我將用於你的情況(SQL Server 2005,併爲你處理SQL的一個存儲過程)的方法。

這裏是如何開始的一個例子(這只是一個選擇語句,但你可以把它更新,如果你想):

CREATE PROCEDURE MySproc (@Accounts XML) 
AS 

SELECT 
    Accounts.AccountID.query('.') 
FROM 
    @Accounts.nodes('//ID/text()') AS Accounts(AccountID) 

GO 
EXEC MySproc '<Accounts><ID>123</ID><ID>456</ID></Accounts>' 
相關問題