如何将存储过程作为文本获取并在另一台服务器上对其进行更改

How to get a stored procedure as a text and alter it on another server

我想知道如何获取文本形式的存储过程并使用 excel 宏在另一台服务器上更新它的双胞胎 (!)。所以我在具有最新版本存储过程的服务器上获得了这个存储过程:

Declare @Lines Table (Line NVARCHAR(MAX));
Declare @FullText NVARCHAR(max) = '';
INSERT @Lines EXEC sp_helptext 'StoredProcName';
Select @FullText = @FullText + Line From @Lines;
Select @FullText

@Fulltext 有'StoredProcName'的完整代码。我想获取此代码,剪切前 6 个字母 (CREATE),在其后附加“ALTER”并在目标 server/database 上添加 运行 以更新其双胞胎 (!)。我得到了这个 excel 宏来实现它:

Sub GetStoredProcedure()
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim cmd1 As ADODB.Command
    Set cmd1 = New ADODB.Command
    
    'Getting data from local
    Set cn = New ADODB.Connection
    cn.ConnectionString = _
        "Provider=SQLOLEDB;" & _
        "Data Source=myDataSource;" & _
        "Initial Catalog=myDataBase;" & _
        "Integrated Security=SSPI;"
        
    
    cn.Open 'Connection establishment.
    
    cmd1.ActiveConnection = cn
    cmd1.CommandType = adCmdStoredProc
    cmd1.CommandText = "UpdateStoredProcedure"
    
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Parameter = Cells(i, 1).Value
    cmd1.Parameters.Refresh
    cmd1.Parameters("@sPName").Value = Parameter
    Set rs = cmd1.Execute
    rs.Open
    Debug.Print rs.State
    Range("K2").CopyFromRecordset rs
    Next i
    
    
    rs.Close 'Deactivating the recordset.
    cn.Close 'Deactivating the connetion.
    
  
    
End Sub

在 运行 启用此宏后,我收到 运行 时间错误“3704”:对象关闭时不允许操作。

在此先感谢您的帮助。

尝试

Option Explicit

Sub GetStoredProcedure()

    Dim cn As ADODB.Connection, rs As ADODB.Recordset
    Dim cmd1 As ADODB.Command
    
    'Getting data from local
    Set cn = New ADODB.Connection
    cn.ConnectionString = _
        "Provider=SQLOLEDB;" & _
        "Data Source=myDataSource;" & _
        "Initial Catalog=myDataBase;" & _
        "Integrated Security=SSPI;"
        
    cn.Open 'Connection establishment.
    
    Dim sProc As String, sCode As String, n As Long, i As Long
    With Range("K:L")
        .Font.Name = "Lucida Console"
        .Font.Size = 11
        .NumberFormat = "@"
        .ColumnWidth = 85
    End With
    
    Set cmd1 = New ADODB.Command
    With cmd1
        .ActiveConnection = cn
        .CommandType = adCmdText
        
        For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            sProc = Cells(i, 1).Value
            .CommandText = "EXEC sp_helptext '" & sProc & "';"
            Set rs = .Execute
            sCode = rs.GetString
            sCode = Replace(sCode, vbCrLf & vbCrLf, vbCrLf)
            Range("K" & i).Value = sCode
            Range("L" & i).Value = Replace(sCode, "CREATE PROCEDURE", "ALTER PROCEDURE")
            n = n + 1
        Next i
    End With
   
    rs.Close 'Deactivating the recordset.
    cn.Close 'Deactivating the connetion.
    MsgBox n & " procedures", vbInformation
    
End Sub