如何在SQL脚本中获取存储过程

时间:2015-05-19 09:54:42

标签: sql-server vb.net stored-procedures

我在其SQL数据库中编写了一个程序存储过程。我想用存储过程脚本获取整个数据库。如果要创建要删除的数据库,我会在加载页面时使用。我在文件夹bin中生成脚本SQL脚本。 但是错了。 vb.net中的代码

Dim cn As New SqlConnection("Data Source=(local);Initial Catalog=master;Integrated Security=True")  'Connect To Database
Dim myconnection As New SqlConnection("Data Source=(local);Initial Catalog=amlak;Integrated Security=True")
Try
        myconnection.Open()
        myconnection.Close()
    Catch ex As Exception

        Dim strsql As String = "CREATE DATABASE amlak COLLATE Persian_100_CI_AS"
        Dim cmd2 As SqlCommand = New SqlCommand(strsql, cn)
        cn.Open()
        cmd2.ExecuteNonQuery()
        cn.Close()
        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = cn
        Dim objReader As New System.IO.StreamReader("script.sql")
        cmd.CommandText = objReader.ReadToEnd
        cmd.CommandText = cmd.CommandText.Replace("GO", ";")
        cmd.CommandText.Split(";")
        cn.Open()
        cmd.ExecuteNonQuery()
        cn.Close()
        Application.Restart()
    End Try

存储过程是一个错误。

  

创建/更改程序'必须是查询批处理中的第一个语句。

     

带有返回值的RETURN语句不能在此上下文中使用。

     

关键字'程序'附近的语法不正确。

     

变量名称' @ cod'已经宣布。变量名在查询批处理或存储过程中必须是唯一的。   带有返回值的RETURN语句不能在此上下文中使用。

     

关键字'程序'附近的语法不正确。

     

变量名称' @ cod'已经宣布。变量名在查询批处理或存储过程中必须是唯一的。

     

带有返回值的RETURN语句不能在此上下文中使用。

2 个答案:

答案 0 :(得分:0)

如果它确实是存储过程,那么我认为您不需要使用StreamReader。您只需要知道要调用的存储过程的名称,并将其设置为CommandText。

cmd.CommandText = "the name of your stored procedure"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = cn
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

答案 1 :(得分:0)

只需替换GO;不管用。 您必须单独执行每个命令。 请注意,拆分操作的结果是一个数组。由于您没有将结果分配给变量,因此该行没有做任何有用的事情

cmd.CommandText.Split(";")

另外:用;替换GO;如果您确定脚本中没有其他GO实例,那么这只是一个好主意。 我建议你做这样的事情:

  Dim cmds As String = File.ReadAllText(pFilename)
  Dim queries As String() 
  queries = System.Text.RegularExpressions.Regex.Split(cmds, "^GO\s+$", RegularExpressions.RegexOptions.Multiline Or RegularExpressions.RegexOptions.IgnoreCase)
  For Each curQuery In queries
    cmd.CommandText = curQuery
    cmd.ExecuteNonQuery()
  Next