【问题标题】:Create Stored Procedure with VB.NET使用 VB.NET 创建存储过程
【发布时间】:2015-05-11 01:07:45
【问题描述】:

我正在尝试在 VB.NET 中完成一个过程,该过程制作 SQL 数据库的副本并创建所有数据库对象(表、函数和存储过程)。我可以成功创建数据库,对于表,我使用以下代码从文本文件加载脚本:

    Dim strConnection As String = myConnectionString
    Dim objCon As New SqlConnection(strConnection)
    Dim objCmd As SqlCommand = Nothing
    Dim sr As StreamReader = Nothing
    Dim sb As System.Text.StringBuilder = Nothing
    Dim line As String = ""
    Dim ScriptFileNames(5) As String
    Dim i As Integer
    Dim filename As String
    ScriptFileNames(1) = "CreateTables.sql"
    ScriptFileNames(2) = "CreateStoredProcedures.sql"
    ScriptFileNames(3) = "CreateFunctions.sql"

    For i = 1 To 1
        filename = SysConfig.DBScriptLocation & ScriptFileNames(i)

        sr = New StreamReader(filename)

        sb = New System.Text.StringBuilder
        Do While sr.Peek() <> -1
            line = sr.ReadLine()
            If (line = "GO" Or line Is Nothing Or line Is System.DBNull.Value) Then
                ' do nothing 
            Else
                If line Is System.DBNull.Value Then
                    sb.Append(ControlChars.CrLf & " ")
                Else
                    sb.Append(ControlChars.CrLf & line)                        
                End If
            End If
        Loop

        ' Create the database            
        objCon.Open()
        objCmd = objCon.CreateCommand()
        ' Execute            
        objCmd.CommandText = sb.ToString
        objCmd.ExecuteNonQuery()
        objCon.Close()
    Next

这对所有表都很有效,但对于存储过程总是很糟糕。我的文本文件如下所示:

创建过程 [dbo].[InsertDeal]( @DealID 为 int)

作为

开始

插入表 1(DealID、LoanID) 选择 @DealID 作为 DealID、LOAN_ID FROM ImportedLoans

插入表 2(DealID、LoanID) 选择 @DealID 作为 DealID、LOAN_ID FROM ImportedLoans

结束

创建过程 SProc2 作为 开始 SProc2 的代码..... 结束

创建过程 SProc23 作为 开始 SProc3 的代码..... 结尾 等等等等

我的代码在“GO”上爆炸,所以我删除了“GO”语句,但它仍然没有运行,并且我收到关于 @DealID 未定义的消息。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 这是故意的——For i = 1 To 1?您只是在阅读您的表格脚本,而不是其他脚本。
  • 是的,I=1 到 1 是故意的,因为它一直在轰炸其他文件。

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


【解决方案1】:

GO 是 SQL Management Studio 关键字,而不是 T-SQL 关键字,因此驱动程序可能对此感到窒息。 GO 导致一个新的 SQL 批处理开始执行,并清除所有以前的上下文,例如变量。但是,在创建存储过程时有一个 DDL 限制,CREATE PROC 必须是第一个关键字,因此在您的文本文件中,我仍然会通过 GO 分隔 CREATE PROC,但分别执行每个 proc 创建而不是发送一次性全部加入。

【讨论】:

    【解决方案2】:

    我实际上从未见过用括号括起来的 T-SQL 创建过程语句中的参数......另外,我认为在声明存储过程的参数时不需要使用“As”这个词(见下文)。

    如果删除参数周围的括号会发生什么?例如:

    CREATE PROCEDURE [dbo].[InsertDeal] 
        @DealID int
    AS
    BEGIN
    
        INSERT INTO Table1 (DealID, LoanID) SELECT @DealID as DealID, LOAN_ID FROM  ImportedLoans
    
        INSERT INTO Table2 (DealID, LoanID) SELECT @DealID as DealID, LOAN_ID FROM ImportedLoans
    
    END
    

    我会在 T-SQL 编辑器中记下您的语法,以便它工作,然后使用这些知识生成您的脚本。

    【讨论】:

    • 我的脚本在带有或不带有括号的 SQL 中运行良好。我更改了我的代码只是为了从文本文件中导入 1 个存储过程,但它仍然会爆炸。我能够直接从 VB.NET 创建存储过程,这似乎可行,但由于我有许多存储过程,我想避免创建 10-20 个函数。
    • 您能否粘贴带有“1 个炸弹程序”的文本文件,然后将您放入的内容粘贴到运行良好的 SQL 中?谢谢。
    • 由于我有这么多存储过程 (SP),我仍然希望能够从文本文件中读取它们,然后以编程方式创建所有存储过程。在我读取我的 SP 文件后,我运行一个拆分命令将每个 SP 作为一个项目保存在一个数组中,然后我可以使用以下代码通过循环运行每个存储过程: sProcs = sb.ToString.Trim.Split(New String( ) {"CREATE"}, StringSplitOptions.RemoveEmptyEntries) For iSprocNumber = 0 To sProcs.Length - 1 objCmd.CommandText = strProcedure objCmd.ExecuteNonQuery() Next
    • 如果您不发送失败的确切 sql 脚本,我将无法提供帮助。祝你好运。
    • 我的存储过程太长,不适合窗口。在我将每个过程解析为一个数组然后单独执行每个过程后,它可以完美运行。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多