2014-02-19 40 views
3

我需要將大量數據移動到sql server 2008數據庫。我從源服務器獲取數據並使用SqlBulkCopy寫入目標服務器。這些數據必須從存儲過程中解析出來然後刪除。我想創建一個臨時數據,但是,如果我使用SqlCommand在客戶端上創建臨時數據,SqlBulkCopy可以訪問該表並且工作正常,如果我使用存儲過程在服務器上執行相同的腳本,SqlBulkCopy.WriteToServer返回該InvalidOperationException異常 「無法訪問目標表 '#Tax'」SqlBulkCopy到SqlServer 2008中的臨時表

這是代碼工作完美:

SqlDataReader oSqlDataReader -> read form server source 
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget) 
SqlCommand oSqlCommand = new SqlCommand("Create Table #Tax (Id int)", oSqlConnection); 
oSqlCommand.CommandType = CommandType.Text; 
oSqlCommand.CommandTimeout = 0; 
oSqlCommand.ExecuteNonQuery(); 
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection) 
oSqlBulkCopy.DestinationTableName = "#Tax"; 
oSqlBulkCopy.WriteToServer(oSqlDataReader); 

這是拋出InvalidOperationException異常代碼:

SqlDataReader oSqlDataReader -> read form server a 
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget) 
SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection); 
oSqlCommand.CommandType = CommandType.StoredProcedure; 
oSqlCommand.CommandTimeout = 0; 
oSqlCommand.ExecuteNonQuery(); 
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection) 
oSqlBulkCopy.DestinationTableName = "#Tax"; 
oSqlBulkCopy.WriteToServer(oSqlDataReader); 

SP_CreateTax:

Create Procedure SP_CreateTax 
AS 
Begin 
    Create Table #Tax (Id int)  
End 

回答

1

問題是在存儲過程中創建的臨時表只在該存儲過程的範圍內有效。一旦完成,臨時表將被刪除。

通過內聯sql創建臨時表的方式(它的工作方式)並繼續前進。

1

看來你的存儲過程沒有執行,然後你的臨時表沒有被創建。 原因是這樣的:

SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection); 

不執行你的存儲過程,因爲執行過程中,你必須調用:EXEC SP_CreateTax

注意:由於SQL Server的保留系統存儲過程的名稱以SP開頭,因此不建議創建名爲SP的存儲過程。因此,必須將自定義存儲過程的名稱與系統名稱區分開來,並將其命名爲uSP_CreateTax

+0

嗨感謝您的回答,使用CommandType.StoredProcedure您必須設置SP的名稱,並且ExecuteNonQuery()也沒有例外,因此sp已執行。此外,爲了確認我已從#Tax重命名爲SP中的表名,並在服務器上創建了表。 – FDB

+0

@FDB嗯..我明白了。請確保您用於連接的SQL Server用戶具有足夠的權限。 –