在 SQL Server 2008 上执行整个 .sql 文件

Posted

技术标签:

【中文标题】在 SQL Server 2008 上执行整个 .sql 文件【英文标题】:Executing Entire .sql file on SQL Server 2008 【发布时间】: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 error:'CREATE/ALTER PROCEDURE' must be the first statement in a query batch? 的可能重复项 确保您的 Sql 语句之间有一个批处理分隔符 GO 使用“GO”分隔命令会导致以下错误:发生严重错误。 'GO' 附近的语法不正确。 @M.Ali:如果您在 SQL Server Management Studio 中执行脚本,这将起作用 - 但在 .NET 应用程序中,GO 不会帮助.... @M.Ali:不,不是真的。我通常做的是有一个.sqlGO 在SSMS 中使用,如果我想从C# 执行这个.sql,我需要在GO 分隔符上拆分它并执行每个分别针对 SQL Server 分段 【参考方案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

【讨论】:

以上是关于在 SQL Server 2008 上执行整个 .sql 文件的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

sql server 2008空间释放

如何转换SQL Server 2008数据库到SQL Server 2005

将 MySQL 脚本转换为 SQL Server [关闭]

怎么在MAC上安装sql server

在 SQL Server 2008 中通过联接在更新表中长时间执行