在 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:不,不是真的。我通常做的是有一个.sql
和GO
在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代理作业错误