Запуск хранимой процедуры с VBA - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь сделать код VBA для запуска хранимых процедур, но я получаю сообщение об ошибке в последней строке. Ошибка:

"Имя объекта или столбца отсутствует или пусто. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других операторов найдите пустые имена псевдонимов. Псевдонимы определены как" "или [] не допускаются. Измените псевдоним на допустимое имя. "

Похоже, это говорит мне, что у меня есть синтаксическая ошибка в последней строке. Как я могу исправить эту ошибку?

 Sub Button_Update()
    'TRUSTED CONNECTION
        On Error GoTo errH
        Dim con As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim strPath As String
        Dim intImportRow As Integer
        Dim CID, LastID As String
        Dim RDate As Variant
        Dim strRecordID As Integer
        Dim server, username, Password, table, database As String


    If MsgBox("Do you want to update this line?", vbYesNo) = vbNo Then Exit Sub

        With Sheets("User Input")

                server = "wesrtednt-prod"
                table = "pr_Load"
                database = "Prod"



                If con.State <> 1 Then

                   con.Open "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Integrated Security=SSPI;"
                    'con.Open

                End If
                'this is the TRUSTED connection string

                Set rs.ActiveConnection = con


                'set first row with records to import
                intImportRow = 2

                Do Until .Cells(intImportRow, 1) = ""
                CID= .Cells(intImportRow, 1)
                    RDate = .Cells(intImportRow, 2)
                    LastID= .Cells(intImportRow, 3)

    If RDate = "" Then RDate = Null



    con.Execute "pr_Load'" & CID& "','" & RDate & "'"""

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Между именем процедуры и первым параметром «pr_Load» & CID должен быть пробел. Целочисленный параметр не нуждается ни в кавычках, ни в NULL, а дата, вероятно, лучше всего отформатирована гггг-мм-дд. Например,

With Sheets("User Input")
    Do Until .Cells(intImportRow, 1) = ""

        CID = .Cells(intImportRow, 1)
        rdate = .Cells(intImportRow, 2)

        sql = "pr_load " & CID
        If rdate = "" Then
            sql = sql & ",NULL"
        Else
            sql = sql & ",'" & Format(rdate, "yyyy-mm-dd") & "'"
        End If
        Debug.Print intImportRow, sql
        con.Execute sql
        intImportRow = intImportRow + 1
    Loop
End With

Если вы хотите использовать параметры, попробуйте

Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
With cmd
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "pr_load"
    .Parameters.Append .CreateParameter("P1", adInteger, adParamInput)
    .Parameters.Append .CreateParameter("P2", adDate, adParamInput)
End With

Dim intImportRow As Long, CID As Integer, rdate As Date, sqldate As String
intImportRow = 2
With Sheets("User Input")
    Do Until .Cells(intImportRow, 1) = ""

        CID = .Cells(intImportRow, 1)
        rdate = .Cells(intImportRow, 2)

        cmd.Parameters(0).Value = CID
        If rdate = 0 Then
            cmd.Parameters(1).Value = Null
            sqldate = "NULL"
        Else
            cmd.Parameters(1).Value = rdate
            sqldate = Format(rdate, "YYYY-YY-DD")
        End If

        Debug.Print intImportRow, CID, sqldate
        cmd.Execute

        intImportRow = intImportRow + 1
    Loop
End With
0 голосов
/ 04 марта 2020

Это может быть просто, если CID& быть CID &, но я думаю, что вы уже получите синтаксическую ошибку такой, какая она есть. В любом случае, вам следует рассмотреть возможность использования объекта ADODB.Command.

Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "pr_Load"
    .Parameters.Append .CreateParameter("CID", adInteger, adParamInput, CID)
    .Parameters.Append .CreateParameter("RDate", adDate, adParamInput, Format$(RDate, "yyyy-mm-dd"))
    .Execute
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...