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

时间:2014-08-14 18:07:36

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

我正在尝试从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()

如何在SqlConnectionCREATE PROCEDURE命令上执行sql文件?

2 个答案:

答案 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分隔符
  • 上的单独子字符串
  • 针对SQL Server
  • 执行单独拆分产生的每个片段

这样,任何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

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

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