对SQL文件的所有MS Access查询
我有一个MS Access数据库,有10多个查询,需要每周更新。将每一个单独导出,然后将每个单独上载到我服务器上的SQL,这真是一件痛苦的事情 我已尝试将Access数据库直接连接到SQL server,但由于安全原因,我的服务器不允许这样做 我发现了一个模块,它将在一个文件中打印查询,但它只打印标题,这是有用的,但不完全是我要找的 以下是模块代码:对SQL文件的所有MS Access查询,sql,ms-access,Sql,Ms Access,我有一个MS Access数据库,有10多个查询,需要每周更新。将每一个单独导出,然后将每个单独上载到我服务器上的SQL,这真是一件痛苦的事情 我已尝试将Access数据库直接连接到SQL server,但由于安全原因,我的服务器不允许这样做 我发现了一个模块,它将在一个文件中打印查询,但它只打印标题,这是有用的,但不完全是我要找的 以下是模块代码: 公共子迭代器DefsCollection() Dim dbMain作为DAO.Database 将qdf设置为DAO.QueryDef 作为
公共子迭代器DefsCollection()
Dim dbMain作为DAO.Database
将qdf设置为DAO.QueryDef
作为DAO.QueryDef的Dim qdfTemp
设置dbMain=CurrentDb
对于dbMain.querydfs中的每个qdf
Debug.Print qdf.Name'打印查询的名称
设置qdfTemp=dbMain.querydfs(qdf.Name)
Debug.Print qdfTemp.SQL'打印查询的SQL语法
下一步
端接头
我不写这些代码,而且对SQL还是相当陌生的,所以我的问题是……有没有办法将我所有的查询及其数据导出到.SQL文件中
提前感谢。您的SQL server的身份验证过程不“知道”谁或什么应用程序正在尝试连接到它。如果您提供了有效的凭据,那么它应该接受连接尝试。正常连接到SQL Server时,您提供什么类型的凭据?(工作时)在指定Access尝试连接的凭据时使用相同的凭据,并且Access连接也将工作。如果在access中创建了链接表,access应要求您指定这些连接凭据。一旦您有了一个连接到sql server的有效链接表,您就可以对sql server表运行Access查询(使用Access链接表作为指针)我不明白您为什么要每周更新10个查询。在我看来,这些应该是参数驱动的,等等。请注意,下面并不是在移动数据。在我看来,代码中的一些追加查询应该可以很好地处理这个问题 下面是我编写的一个模块,试图将Access 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
Sub-copyallqueryasviewsdao()
Dim strError作为字符串,strQueryName作为字符串,lngQueryID作为长字符串
Dim Q作为QueryDef,BLNSSUCCESS FULQ作为布尔值
Dim strSQL作为字符串,strNewSQL作为字符串,strConnect作为字符串
Dim intCountFailure为整数,intCountSuccessful为整数
Dim intAlreadyAnError为整数,strAction为字符串
将mydatabase设置为DAO.Database,将myquerydef设置为DAO.QueryDef
关于错误转到tagError
strConnect=“ODBC;DRIVER={sqlserver};DATABASE=”&_
strTestDatabaseName&“SERVER=“&strSQLServerName&“;”和_
“受信任的连接=是”
沙漏真的吗
对于dbsPermanent.QueryDefs中的每个Q
intAlreadyAnError=0
strQueryName=Q.名称
如果左(strQueryName,4)=“~sq_”,则
其他的
strError=“”
strAction=“”
lngQueryID=FetchQueryID(strQueryName,blnsucessfulq)'添加记录或查找ID
如果blnsucessfulq=False,则
strNewSQL=adhcreplace(Q.SQL,vbCrLf,“”)
strNewSQL=Left(strNewSQL,InStr(strNewSQL,“;”)-1)
strNewSQL=ConvertTrueFalseTo10(strNewSQL)
tagRetryAfterCleanup:
设置myquerydef=dbsPermanent.CreateQueryDef(“”“Q.Name&“DAO测试”)
myquerydef.ReturnsRecords=False
myquerydef.Connect=strConnect
myquerydef.SQL=“创建视图[”&strQueryName&“]AS”&strNewSQL
myquerydef.Execute
myquerydef.关闭
strSQL=“更新zCreateQueryErrors集zcqErrorMsg=‘成功’”&_
“其中ID=“&lngQueryID&;”
CurrentDb.执行strSQL,dbFailOnError
intCountSuccessful=intCountSuccessful+1
如果结束
如果结束
tagResumeAfterError:
下一个
沙漏假文件
MsgBox“有”&intCountSuccessful&“成功”&vbCrLf&_
intCountFailure&“failures”
出口接头
标记错误:
'MsgBox错误说明
Dim errX作为DAO.Error,strFunctionName作为字符串,intPosnFunction作为整数
作为字符串的Dim strThisError
如果错误。计数>1,则
对于DAO.Errors中的每个errX
strThisError=mID(errX.Description,48)
如果intAlreadyAnError>5,则“点击10个错误,因此不要尝试清理查询”
如果错误号为3146,则
strError=strError&“修复后:&errX.Number&:”&strThisError&“
如果结束
其他的
选择Case errX.Number
案例3146“忽略,因为这是通用OLE db错误
案例195“xxx”不是可识别的函数名。>插入dbo。函数名前面
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&“为”&strFunctionName&“插入的dbo”
恢复tagRetryAfterCleanup
“订单条款无效