2015-11-03 61 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脚本”。 –