2015-11-03 71 views
-1

我有一個SQL腳本和GO批處理分隔符,我嘗試從C#代碼執行。當我使用Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery時,效果很好。不過,它發生在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReaderMicrosoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults使用GO批處理分隔符和讀取結果執行SQL腳本

System.AggregateException: One or more errors occurred. ---> 
Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. ---> 
System.Data.SqlClient.SqlException: Incorrect syntax near 'GO'. 

這是一個非常簡單的腳本,看起來像這樣:

SELECT 
    DB_NAME() 
AS 
    'Database Name'; 
GO 

EXEC [schema].[MyStoredProcedure]; 
GO 

SELECT 
    [Column] 
AS 
    'Friendly Column Name' 
FROM 
    [schema].[Table]; 
GO 

我試圖script.Replace("\n", "\r\n"),我也得到了相同的結果。有誰知道我可以如何執行這樣的腳本獲得結果嗎?

+1

GO不是實際的SQL語句。這是一些sql實用程序使用的批分隔符。看[這裏](http://stackoverflow.com/questions/2299249/what-is-the-use-of-go-in-sql-server-management-studio)。所以基本上GO不是有效的SQL。您應該將所有這些查詢,存儲過程調用放在一個存儲過程中 –

+0

感謝您的回覆@DustinHodges!請參閱[John Galloway的博客文章,題爲「處理」GO「SQL腳本中的分隔符 - 簡單的方法」](http://weblogs.asp.net/jongalloway//Handling-_2200_GO_2200_-Separators-in-SQL-Scripts-_2D00_簡單的方法)瞭解更多關於SMO庫如何幫助混淆你描述的問題。 –

+0

檢查了那個迴應。關鍵是他正在使用ExecuteNonQuery,它不返回任何結果。正如你在你的問題中看到的那樣,ExecuteNonQuery可以使用批分隔符,但是如果你想返回結果,你的批處理分隔符運氣不佳 –

回答

-1

ExecuteReader和ExecuteWithResults無法識別批處理分隔符GO。最容易做的事情將是剛剛卸下GOS腳本,並呼籲ExecuteWithResults

腳本

SELECT 
    DB_NAME() 
AS 
    'Database Name'; 

EXEC [schema].[MyStoredProcedure]; 

SELECT 
    [Column] 
AS 
    'Friendly Column Name' 
FROM 
    [schema].[Table]; 

代碼

DataSet ds = Database.ExecuteWithResults(script); 
DataTable dbNameTable = ds.Tables[0]; //Select DB_NAME() 
DataTable storedProcedureResults = ds.Tables[1]; //Exec [schema].[MyStoredProcedure] 
DataTable queryResults = ds.Tables[2]; //Select [Column] From [Schema].[Table] 
+0

根據[此Microsoft Connect反饋頁面](http://connect.microsoft.com/SQLServer/feedbackdetail/view/192409/error-when-using-executewithresults-smo-database-object-method),Microsoft。 SqlServer.Management.Smo.Database.ExecuteWithResults'方法應該識別GO批量分隔符,但是我仍然無法使其工作。 –

+0

首先,這個問題是從2006年開始的,並且幾乎沒有任何討論,並且錯誤表示他在使用nolock時只會出錯。其次,我不認爲它適用,因爲只有一個數據表正在返回。第三,您在評論中鏈接到您的問題的文章明確指出批處理分隔符僅適用於您的結果顯示的ExecuteNonQuery。您似乎迫切希望將非SQL GO批處理分隔符保留在SQL查詢中,原因不明白。你試過我的解決方案嗎?它沒有工作嗎? –

+0

該問題表明應該處理'GO'批分隔符。事實上,'BatchSeparator'屬性[已有詳細記錄](https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.batchseparator)。我不知道爲什麼數據表的數量會影響這個例子。我不確定你是否閱讀了Galloway博客文章的評論,但是具體說明ExecuteWithResults應該有效。當你說「解決方案」時,你是指上面的答案嗎?這不是我的問題的解決方案,「用GO批處理分隔符和讀取結果執行SQL腳本」。 –