【问题标题】:Executing Entire .sql file on SQL Server 2008在 SQL Server 2008 上执行整个 .sql 文件
【发布时间】:2014-08-14 18:07:36
【问题描述】:

我正在尝试从 vb.net 应用程序在 SQL Server 上执行整个 SQL 命令文件。问题是如果 SQL 文件包含任何 CREATE PROCEDURE 命令,我会收到以下错误:

发生了严重错误。 'CREATE/ALTER PROCEDURE' 必须是 查询批处理中的第一条语句。关键字附近的语法不正确 '过程'

Dim sql = sqlFile.ReadToEnd()

Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("SiteSqlServer").ToString), cmd As New SqlCommand
With cmd
    .Connection = conn
    .CommandType = CommandType.Text
    .CommandText = sql
    .CommandTimeout = 300    
End With

conn.Open()
cmd.ExecuteNonQuery  
conn.Close()

如何通过包含CREATE PROCEDURE 命令的SqlConnection 执行sql 文件?

【问题讨论】:

  • 确保您的 Sql 语句之间有一个批处理分隔符 GO
  • 使用“GO”分隔命令会导致以下错误:发生严重错误。 'GO' 附近的语法不正确。
  • @M.Ali:如果您在 SQL Server Management Studio 中执行脚本,这将起作用 - 但在 .NET 应用程序中,GO 不会帮助....
  • @M.Ali:不,不是真的。我通常做的是有一个.sqlGO 在SSMS 中使用,如果我想从C# 执行这个.sql,我需要在GO 分隔符上拆分它并执行每个分别针对 SQL Server 分段

标签: sql sql-server vb.net sql-server-2008


【解决方案1】:

问题是每个CREATE PROCEDURE 都必须是批处理中的第一个语句(正如错误消息清楚地表明的那样)。

如果您要在 SQL Server Management Studio 中执行 .sql,则可以使用 GO 作为分隔符:

....
GO 

CREATE PROCEDURE dbo.SomethingOrAnother......

但是这个GO 是特定于SSMS 的分隔符——不是一般的SQL 语句。

从 VB.NET 对 SQL Server 执行完整的.sql 脚本文件真的没有“神奇”的方法——我通常做的是这些步骤:

  • 将整个.sql文件读入字符串
  • 将包含整个脚本的字符串拆分为GO分隔符上的单独子字符串
  • 针对 SQL Server 分别执行由此拆分产生的每个片段

这样,任何CREATE PROCEDURE .... 都将成为单独批处理中的第一条语句,然后您的脚本应该可以在 VB.NET 中正常工作。

【讨论】:

    【解决方案2】:

    您可以在脚本中保留GO 分隔符,但您应该使用可以在

    中找到的Microsoft.SqlServer.Smo 对象执行脚本

    C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies(或适合您版本的目录)

    Dim cmd = File.ReadAllText("d:\temp\create.sql")
    Using con = new SqlConnection("....")
        Dim svrConnection = new ServerConnection(con)
        Dim server = new Server(svrConnection)
        Dim col = new StringCollection()
        col.Add(cmd)
        server.ConnectionContext.ExecuteNonQuery(col)
    End Using
    

    您需要引用(和导入)以下程序集

    • Microsoft.SqlServer.Smo
    • Microsoft.SqlServer.ConnectionInfo
    • Microsoft.SqlServer.Management.Sdk.Sfc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多