我正在尝试从vb.net应用程序在SQL Server上执行整个SQL命令文件。问题是如果SQL文件包含任何CREATE PROCEDURE
命令,我会收到以下错误:
发生严重错误。 '创建/更改程序'必须是 查询批处理中的第一个语句。关键字附近的语法不正确 ' PROC'
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()
如何在SqlConnection
个CREATE PROCEDURE
命令上执行sql文件?
答案 0 :(得分:2)
问题是每个CREATE PROCEDURE
都需要成为批处理中的第一个语句(如错误消息所示)。
如果您要在SQL Server Management Studio中执行.sql
,则可以使用GO
作为分隔符:
....
GO
CREATE PROCEDURE dbo.SomethingOrAnother......
但是这个GO
是SSMS特定的分隔符 - 而不是一般的SQL语句。
从VB.NET对SQL Server执行完整的.sql
脚本文件实际上没有“神奇”的方法 - 我通常做的就是这些步骤:
.sql
文件读入字符串GO
分隔符这样,任何CREATE PROCEDURE ....
都将成为单独批处理中的第一个语句,然后您的脚本应该可以在VB.NET中正常工作。
答案 1 :(得分:0)
您可以在脚本中保留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
您需要对以下程序集进行引用(和导入)