Все запросы MS Access в файл SQL - PullRequest
0 голосов
/ 14 сентября 2009

У меня есть база данных MS Access с более чем 10 запросами, которые необходимо обновлять еженедельно. Очень сложно экспортировать каждый из них отдельно, а затем загружать каждый отдельно в SQL на моем сервере.

Я пытался подключить свою базу данных Access напрямую к моему SQL-серверу, но мой сервер не позволяет этого по соображениям безопасности.

Я нашел модуль, который будет печатать запросы в одном файле, но он печатает только заголовки, что полезно, но не совсем то, что я ищу.

Вот этот код модуля:

Public Sub IterateQueryDefsCollection()<br> <br> Dim dbMain As DAO.Database<br> <br> Dim qdf As DAO.QueryDef<br> Dim qdfTemp As DAO.QueryDef<br> <br> Set dbMain = CurrentDb<br> <br> For Each qdf In dbMain.QueryDefs<br> Debug.Print qdf.Name 'Prints name of query<br> Set qdfTemp = dbMain.QueryDefs(qdf.Name)<br> Debug.Print qdfTemp.SQL 'Prints SQL Syntax of query<br> Next<br> <br> End Sub

Я не пишу эти коды и все еще довольно плохо знаком с SQL, поэтому мой вопрос в том ... есть ли способ экспортировать все мои запросы вместе с их данными в файл .sql.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 15 сентября 2009

Я озадачен тем, почему вы хотите обновлять десять запросов каждую неделю. Мне кажется, они должны быть управляемыми параметрами и т. Д. Обратите внимание, что следующее не перемещает данные. Мне кажется, некоторые запросы на добавление в коде должны справиться с этим довольно хорошо.

Ниже приведен модуль, который я написал, чтобы попытаться увеличить размер всех запросов в MDB-доступе к серверу. Обратите внимание, что, поскольку некоторые из этих запросов были «сложены», то есть они вызывали другие запросы, вам пришлось запускать эту подпрограмму несколько раз, пока она не могла больше увеличиваться.

    Sub CopyAllQueriesAsViewsDAO()
        Dim strError As String, strQueryName As String, lngQueryID As Long
        Dim Q As QueryDef, blnSuccessfulQ As Boolean
        Dim strSQL As String, strNewSQL As String, strConnect As String
        Dim intCountFailure As Integer, intCountSuccessful As Integer
        Dim intAlreadyAnError As Integer, strAction As String

        Dim mydatabase As DAO.Database, myquerydef As DAO.QueryDef

    On Error GoTo tagError

        strConnect = "ODBC;DRIVER={sql server};DATABASE=" & _
            strTestDatabaseName & ";SERVER=" & strSQLServerName & ";" & _
            "Trusted_Connection=Yes"
        DoCmd.Hourglass True


        For Each Q In dbsPermanent.QueryDefs
            intAlreadyAnError = 0
            strQueryName = Q.Name
            If Left(strQueryName, 4) = "~sq_" Then
            Else
                strError = ""
                strAction = ""
                lngQueryID = FetchQueryID(strQueryName, blnSuccessfulQ) ' Add the record or locate the ID
                If blnSuccessfulQ = False Then
                    strNewSQL = adhReplace(Q.SQL, vbCrLf, " ")
                    strNewSQL = Left(strNewSQL, InStr(strNewSQL, ";") - 1)
                    strNewSQL = ConvertTrueFalseTo10(strNewSQL)

    tagRetryAfterCleanup:
                    Set myquerydef = dbsPermanent.CreateQueryDef("") 'Q.Name & " DAO Test")
                    myquerydef.ReturnsRecords = False
                    myquerydef.Connect = strConnect
                    myquerydef.SQL = "CREATE VIEW [" & strQueryName & "] AS " & strNewSQL
                    myquerydef.Execute
                    myquerydef.Close

                    strSQL = "UPDATE zCreateQueryErrors SET zcqeErrorMsg = 'Successful' " & _
                        "WHERE ID=" & lngQueryID & ";"
                    CurrentDb.Execute strSQL, dbFailOnError
                    intCountSuccessful = intCountSuccessful + 1
                End If
            End If
    tagResumeAfterError:
        Next

        DoCmd.Hourglass False

        MsgBox "There were " & intCountSuccessful & " successful." & vbCrLf & _
            intCountFailure & " failures."


        Exit Sub

    tagError:
      '  MsgBox Err.Description

      Dim errX As DAO.Error, strFunctionName As String, intPosnFunction As Integer
      Dim strThisError As String

        If Errors.Count > 1 Then
            For Each errX In DAO.Errors
                strThisError = mID(errX.Description, 48)
                If intAlreadyAnError > 5 Then  ' Hit 10 errors so don't attempt to clean up the query
                    If errX.Number <> 3146 Then
                        strError = strError & "After fix: " & errX.Number & ": " & strThisError & " "
                    End If
                Else
                    Select Case errX.Number
                    Case 3146 ' Ignore as this is the generic OLE db error
                    Case 195 '  'xxx' is not a recognized function name. > Insert dbo. in front of function name
                        intAlreadyAnError = intAlreadyAnError + 1
                        strFunctionName = mID(strThisError, 2, InStr(2, strThisError, "'") - 2)
                        intPosnFunction = InStr(strNewSQL, strFunctionName)
                        strNewSQL = Left(strNewSQL, intPosnFunction - 1) & "dbo." & mID(strNewSQL, intPosnFunction)
                        strAction = strAction & "Inserted dbo for " & strFunctionName & " "
                        Resume tagRetryAfterCleanup
                    ' The ORDER BY clause is invalid in views, .... , unless TOP is also specified.
                    Case 1033 'TOP 100 PERCENT
                        strNewSQL = Left(strNewSQL, 7) & " TOP 100 PERCENT " & mID(strNewSQL, 8)
                        strAction = strAction & "Inserted TOP 100 PERCENT "
                        Resume tagRetryAfterCleanup
                    Case Else
                        strError = strError & errX.Number & ": " & mID(errX.Description, 48) & " "
                    End Select
                End If
            Next errX
        Else
            strError = Err.Number & ", " & Err.Description
        End If

        strSQL = "UPDATE zCreateQueryErrors SET zcqeErrorMsg = '" & adhHandleQuotes(strError) & "', " & _
            "zcqeAction = '" & strAction & "', zcqeFinalSQL = '" & adhHandleQuotes(strNewSQL) & "' " & _
            "WHERE ID=" & lngQueryID & ";"
        CurrentDb.Execute strSQL, dbFailOnError
        intCountFailure = intCountFailure + 1
        Resume tagResumeAfterError

    End Sub

Public Function ConvertTrueFalseTo10(strIncoming As String)

    Dim strIntermediate As String, intPosn As Integer

    strIntermediate = strIncoming

    intPosn = InStr(strIntermediate, "=false")
    While intPosn <> 0
        strIntermediate = Left(strIntermediate, intPosn - 1) & "=0" & mID(strIntermediate, intPosn + 6)
        intPosn = InStr(strIntermediate, "=false")
    Wend

    intPosn = InStr(strIntermediate, "=true")
    While intPosn <> 0
        strIntermediate = Left(strIntermediate, intPosn - 1) & "=1" & mID(strIntermediate, intPosn + 5)
        intPosn = InStr(strIntermediate, "=true")
    Wend


    ConvertTrueFalseTo10 = strIntermediate

End Function


Function FetchQueryID(strQueryName As String, blnSuccessfulQ As Boolean) As Long

    Dim myRS As Recordset
    Dim strSQL As String
    blnSuccessfulQ = False

    strSQL = "SELECT ID, zcqeErrorMsg FROM zCreateQueryErrors " & _
        "WHERE zcqeName='" & strQueryName & "';"
    Set myRS = dbsPermanent.OpenRecordset(strSQL, dbOpenSnapshot)
    If myRS.EOF Then
        Set myRS = dbsPermanent.OpenRecordset("zCreateQueryErrors", dbOpenSnapshot)
        myRS.AddNew
        myRS!zcqeName = strQueryName
        myRS.Update
        myRS.Move 0, myRS.LastModified
        FetchQueryID = myRS!ID
    Else
        myRS.MoveFirst
        FetchQueryID = myRS!ID
        If myRS!zcqeErrorMsg = "Successful" Then
            blnSuccessfulQ = True
        End If
    End If
    myRS.Close
    Set myRS = Nothing

End Function

Public Function adhHandleQuotes(strValue As String) As String
    ' Fix up all instances of a quote within a string by
    ' breaking up the string, and inserting Chr$(34) whereever
    ' you find a quote within the string.  This way, Jet can
    ' handle the string for searching.
    '
    ' From Access 97 Developer's Handbook
    ' by Litwin, Getz, and Gilbert (Sybex)
    ' Copyright 1997.  All rights reserved.
    '
    ' Solution suggested by Jurgen Welz, a diligent reader.

    ' In:
    '   strValue:   Value to fix up.
    ' Out:
    '   Return value: the text, with quotes fixed up.
    ' Requires:
    '   adhReplace (or some other function that will replace
    '       one string with another)
    '
    ' Example:
    '    adhHandleQuotes("John "Big-Boy" O'Neil") returns
    '     "John " & Chr$(34) & "Big-Boy" & Chr$(34) & " O'Neil"

   Const QUOTE As String = """"
   Const SingleQUOTE As String = "'"

   adhHandleQuotes = adhReplace(strValue, SingleQUOTE, _
    SingleQUOTE & SingleQUOTE)
 End Function

 Function adhReplace(ByVal varValue As Variant, _
  ByVal strFind As String, ByVal strReplace As String) As Variant

     ' Replace all instances of strFind with strReplace in varValue.

     ' From Access 97 Developer's Handbook
     ' by Litwin, Getz, and Gilbert (Sybex)
     ' Copyright 1997.  All rights reserved.

     ' In:
     '    varValue: value you want to modify
     '    strFind: string to find
     '    strReplace: string to replace strFind with
     '
     ' Out:
     '    Return value: varValue, with all occurrences of strFind
     '     replaced with strReplace.

     Dim intLenFind As Integer
     Dim intLenReplace As Integer
     Dim intPos As Integer

     If IsNull(varValue) Then
         adhReplace = Null
     Else
         intLenFind = Len(strFind)
         intLenReplace = Len(strReplace)

         intPos = 1
         Do
             intPos = InStr(intPos, varValue, strFind)
             If intPos > 0 Then
                 varValue = Left(varValue, intPos - 1) & _
                  strReplace & mID(varValue, intPos + intLenFind)
                 intPos = intPos + intLenReplace
             End If
         Loop Until intPos = 0
     End If
     adhReplace = varValue
 End Function
1 голос
/ 14 сентября 2009

Процесс проверки подлинности вашего SQL-сервера не «знает», кто или какое приложение пытается подключиться к нему. Если вы предоставите действительные учетные данные, тогда он должен принять попытку подключения. Какие учетные данные вы предоставляете при обычном подключении к SQL Server? (когда это работает) Используйте те же самые, когда вы указываете учетные данные, с которыми Access пытается соединиться, и соединение Access также будет работать. Если вы создали связанные таблицы внутри доступа, Access должен попросить вас указать эти учетные данные подключения. После того, как у вас есть действующая связанная таблица, подключенная к серверу sql, вы сможете выполнять запросы Access к таблице SQL Server (используя в качестве указателя Access Access Table)

0 голосов
/ 15 сентября 2009

Вы спрашиваете, есть ли способ экспортировать файл SQL для этого. Существует, но вы должны написать код, чтобы сделать это, то есть пройтись по каждой строке результатов вашего запроса и написать оператор вставки (т. Е. INSERT INTO (Field1, Field2) VALUES (value1, value2) (value3, value4) и т. д.) на правильном диалекте SQL для целевого механизма базы данных.

Тем не менее, может быть легко экспортировать файл CSV (или разделенный табуляцией или любой другой) и ваша база данных импортирует этот файл.

Нет никакого реального способа узнать, как ответить на ваш вопрос, так как недостаточно подробностей о том, что на самом деле делают запросы. Если это операторы INSERT, выше будет именно то, что вы хотите.

Если они ОБНОВЛЕНИЯ, это сложнее.

Но, возможно, вышесказанное поможет вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...