如何使用SqlCommand将多个T-SQL语句(由GO分隔)链接到单个SQL调用中

Mik*_*ike 8 .net c# sql sqlcommand

我有一个C#桌面应用程序,它调用各种SQL Server存储过程来执行各种导出和导入数据到SQL Server 2008 R2数据库的工作.

这些都很好,没问题.我的应用程序通过所有参数调用它们就好了.

为了"帮助用户",我正在编写一个按钮,将所有存储过程添加到配置的数据库中.为此,我创建了一个脚本:

USE [%DATABASENAME%]
GO        

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc1]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc1]
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc2]
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc3]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc3]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spMyProc1]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO
--

CREATE PROCEDURE [dbo].[spMyProc2]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO
--

CREATE PROCEDURE [dbo].[spMyProc3]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO
Run Code Online (Sandbox Code Playgroud)

当我在SQL Server Management Studio中运行它时,它运行正常,没有任何问题.

但是在我的C#应用​​程序中,抛出异常并且我得到一堆错误,如下所示:

'GO'附近的语法不正确.
'GO'附近的语法不正确.
'GO'附近的语法不正确.
'GO'附近的语法不正确.
'GO'附近的语法不正确.
'GO'附近的语法不正确.
'CREATE/ALTER PROCEDURE'必须是查询批处理中的第一个语句.
带有返回值的RETURN语句不能在此上下文中使用.
带有返回值的RETURN语句不能在此上下文中使用.
'GO'附近的语法不正确.
必须声明标量变量"@MessageText".
必须声明标量变量"@ListOfIDsToImport".
必须声明标量变量"@SourceDataFolder".
必须声明标量变量"@SourceDataFolder".
必须声明标量变量"@SequenceNo".
必须声明标量变量"@UserID".
必须声明标量变量"@SequenceNo".
必须声明标量变量"@UserID".
必须声明标量变量"@ListOfIDsToImport".
必须声明标量变量"@ListOfIDsToImport".
必须声明标量变量"@ListOfIDsToImport".
必须声明标量变量"@MessageText".
必须声明标量变量"@MessageText".
必须声明标量变量"@MessageText".
'GO'附近的语法不正确.
变量名'@ PS_DEFAULT'已经声明.变量名在查询批处理或存储过程中必须是唯一的.
变量名称'@PS_ERROR_MSG'已经声明.变量名在查询批处理或存储过程中必须是唯一的.
变量名'@ PS_ERROR_SEVERITY'已经声明.变量名在查询批处理或存储过程中必须是唯一的.
必须声明标量变量"@SequenceNo".
'GO'附近的语法不正确.

(这是ex.Message中由下面的代码中的catch块捕获的内容).

我的代码非常简单如下:

    bool retVal = false;
    string command = Properties.Resources.MyApp_StoredProcedures.ToString().Replace("%DATABASENAME%", Properties.Settings.Default.DBName);

    try
    {
        sqlCmd = new SqlCommand(command, csSQLConnection._conn);
        sqlCmd.ExecuteNonQuery();
        retVal = true;
    }
    catch (Exception ex)
    {
        retVal = false;
    }
    finally
    {
        sqlCmd.Dispose();
    }
Run Code Online (Sandbox Code Playgroud)

(上面的替换只是替换脚本顶部的USE行中的占位符,它可以正常工作,当我逐步完成该行时).

所以基本上,我做错了什么因为SQL本身似乎没问题?

非常感谢

Ran*_*s1r 2

这应该很容易...

摆脱 GO,这是 SSMS 特定的语法,SQL 语言不需要或支持它,而您应该使用 ; 终止您的个人创建脚本。。让我知道进展如何。

  • 这是行不通的 - 因为诸如 *CREATE/ALTER PROCEDURE' 之类的东西必须是查询批处理中的第一个语句。 * 不会用这种 *drop all `GO`* 方法来修复...... (2认同)