【发布时间】:2023-03-10 13:25:01
【问题描述】:
我有一个带有 GO 批处理分隔符的 SQL 脚本,我试图从 C# 代码中执行该脚本。当我使用Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery 时,效果很好。不过,它在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReader 或 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults 上爆炸了。
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"),得到了相同的结果。有谁知道我如何执行这样的脚本并返回结果?
【问题讨论】:
-
GO 不是一个实际的 SQL 语句。它是一些 sql 实用程序使用的批处理分隔符。见here。所以基本上 GO 不是有效的 SQL。您应该将所有这些查询、存储过程调用放在一个存储过程中
-
感谢您的回复,@DustinHodges!请参阅John Galloway's blog post entitled "Handling "GO" Separators in SQL Scripts - the easy way" 了解更多关于 SMO 库如何帮助混淆您描述的问题。
-
查看了该回复。关键是他正在使用不返回任何结果的 ExecuteNonQuery。正如您在问题中看到的那样,ExecuteNonQuery 可以使用批处理分隔符,但是如果您想返回结果,那么批处理分隔符就不走运了
-
解决方法是创建多个脚本并单独执行它们,或者类似这个 ps 示例,在 GO 上拆分字符串。 robinosborne.co.uk/2014/10/13/… 字符串拆分有点农业。使用 GO 的主要原因是如果你有 DDL 语句,并且你真的不想要这些结果,因此 ExecuteNonQuery 工作。我认为 ExecuteWithResults 不适用于 GO 的主要原因是因为返回的数据集是不可预测的,因此不能期望 c# 处理所有情况。
标签: c# sql-server smo datareader executereader