2010-11-09 92 views
5

我正在使用SMO執行批量SQL腳本。在Management Studio中,該腳本在大約2秒內執行。使用以下代碼,大約需要15秒。SQL SMO執行批量TSQL腳本

var connectionString = GetConnectionString(); 
// need to use master because the DB in the connection string no longer exists 
// because we dropped it already 
var builder = new SqlConnectionStringBuilder(connectionString) 
{ 
    InitialCatalog = "master" 
}; 

using (var sqlConnection = new SqlConnection(builder.ToString())) 
{ 
    var serverConnection = new ServerConnection(sqlConnection); 
    var server = new Server(serverConnection); 

    // hangs here for about 12 -15 seconds 
    server.ConnectionContext.ExecuteNonQuery(sql); 
} 

的腳本創建一個新的數據庫,並跨越了幾桌插入幾千行。由此產生的DB大小約爲5MB。

任何人都有任何這方面的經驗,或有建議,爲什麼這可能會與SMO如此緩慢地運行?

+0

我會說這是不值得擔心的,15秒創建數據庫似乎是合理的。除了當你在SSMS中執行查詢時,你已經連接到服務器了嗎?不同的客戶機? – MrEdmundo 2010-11-10 08:55:13

+0

同一臺客戶機。打開連接似乎並不需要很長時間,只需執行ExecuteNonQuery調用即可。值得關注的是,這一步是我們單元測試的AssemblyInitialize方法的一部分,因此,啓動單元測試需要額外的15秒鐘是一件非常煩惱的事情。 – Jeff 2010-11-10 15:38:26

+0

有人嗎?我真的想用這些腳本來進行單元測試。 – Jeff 2010-11-22 20:38:11

回答

4

SMO做很多奇怪的東西..在後臺,這是你支付治療在面向對象的方式服務器/數據庫對象能力的價格。
由於您沒有使用SMO的OO功能,爲什麼不完全忽略SMO並且只需通過普通的ADO運行腳本?

+0

肯定會這樣做,但要記住這是一個SQL Management Studio生成的數據腳本(即多個GO語句)。有沒有辦法用普通的ADO運行腳本? – Jeff 2010-11-28 22:25:31

+0

是的,只需將所有「GO」替換爲「;」你很好:) – 2010-11-29 18:39:13

+3

我通常使用「GO」來分割字符串,並將每個子字符串執行爲sql。 – 2010-11-29 20:12:53

0

將記錄上載到數據庫的最佳和最快的方式是通過SqlBulkCopy。
特別是當你的腳本加上1000個記錄時 - 這將會顯着提高速度。
您需要做一些工作才能將數據存入DataSet,但這可以使用DataSet xml函數輕鬆完成。

+0

我肯定會使用批量複製,但這些是通過生成腳本功能在Management Studio中生成的腳本。有沒有辦法,我仍然可以使用這些腳本龐大的副本? – Jeff 2010-11-12 19:55:02

+0

不幸的不是。 SQLBulkCopy需要一個數據集作爲輸入。 – blorkfish 2010-11-15 03:40:46