2012-03-14 72 views
2

我知道有一類system.data.sqlclient.sqlcommand可以一次執行批次。由於我有很多如果SQL Server腳本(其中有一些關鍵詞在其中),我需要找到一種方法,可以將此腳本投放到SQL Server執行。這個怎麼做 ?謝謝。在.Net中,如何針對實例執行SQL Server腳本?


編輯:

恩里科您好,感謝您提供的信息。 executenonquery方法將返回一個int []類型。我如何獲得所有文本結果?例如,我有這個SQL腳本叫做sql.sql

PRINT 'blah blah blah'; 
GO 
SELECT @@SERVERNAME AS instance; 

當我使用sqlcmd執行它時,我得到以下結果。

C:\TEMP>sqlcmd -S (local)\instance1 -U a -P a -i sql.sql 
blah blah blah 
instance 

------------------------------------------------------------------- 
THESIMPSONS\INSTANCE1 


(1 rows affected) 

C:\TEMP> 

如何使用SMO或ADO.NET類獲得類似結果?謝謝。

回答

5

SQL Server Management Objects (SMO) API的ServerConnection.ExecuteNonQuery方法部分將正確地執行包含由GO關鍵字分離多個批次 T-SQL腳本。

作爲一個側面說明,你甚至可以決定通過設置ServerConnection.BatchSeparator屬性,默認情況下爲"GO"用你自己的批次分隔

如果您的腳本返回了您希望返回到應用程序中的多個結果集,則可以使用ServerConnection.ExecuteReaderServerConnection.ExecuteWithResults方法。不過,請記住那些方法do not support T-SQL scripts with multiple batches。在這一點上,你有兩個選擇:

  • 斯普利特腳本"GO"分隔成多個串,每個包含單批,並通過上述方法中的一種執行。
  • 從您的代碼調用SQLCMD通過產生一個新進程並傳遞腳本作爲參數執行。
+0

有趣;還沒有看到一個 - 閱讀 – 2012-03-14 08:22:23

+0

對這些重載有一個評論:「sqlCommand參數包含一個Transact-SQL語句。」 - 如果按照您的描述進行操作,那麼文檔就會有誤導性。 – 2012-03-14 08:24:09

+0

@MarkGravell:你說的對,文檔有誤導性,但它確實有效。 – Tao 2012-03-14 08:31:41

0

SqlCommand可以執行多個語句在一個作爲語句被包裹在BEGINEND,像一個存儲過程,只要去。我已經這樣做了,但我認爲只允許數據操作命令。

SQL Server Management Objects可能能夠做你想做的,因爲它們也可以用來發出數據定義命令。