Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否有快速的方法将ADO记录集转储到新的MS ACCESS表中?_Sql Server_Vba_Ms Access 2016 - Fatal编程技术网

Sql server 是否有快速的方法将ADO记录集转储到新的MS ACCESS表中?

Sql server 是否有快速的方法将ADO记录集转储到新的MS ACCESS表中?,sql-server,vba,ms-access-2016,Sql Server,Vba,Ms Access 2016,我们有一个SQL Server后端和MS ACCESS 2016前端。我们有一个通用的ADO连接对象,用于向数据库发送SQL命令。当我们有返回某些内容的SQL时,我们使用代码来构建passthru查询对象,这是一种将SQL输出导入前端的简便方法 我们现在的情况是,我们有一些非常复杂的SQL,它返回一个输出,但由几个语句组成,包括在服务器上构造几个临时表。我们不能使用“构建一个passthru查询对象”方法,因为passthru不能处理多个SQL语句,并且我们不能一次发送一个SQL语句,因为临时表

我们有一个SQL Server后端和MS ACCESS 2016前端。我们有一个通用的ADO连接对象,用于向数据库发送SQL命令。当我们有返回某些内容的SQL时,我们使用代码来构建passthru查询对象,这是一种将SQL输出导入前端的简便方法

我们现在的情况是,我们有一些非常复杂的SQL,它返回一个输出,但由几个语句组成,包括在服务器上构造几个临时表。我们不能使用“构建一个passthru查询对象”方法,因为passthru不能处理多个SQL语句,并且我们不能一次发送一个SQL语句,因为临时表在查询完成后会被销毁

目前,我们正在使用ADO对象将输出获取到ADO记录集中,然后将记录集保存为.XML,最后将.XML文件导入数据库。但这是大量的I/O,对于大输出来说速度很慢

有没有更好(更快)的方法将复杂的SQL输出到MS Access前端的本地表中

下面是我们的vba类对象的剪贴画:

Private Const DB_CONNECTION_STRING As String = "<our connection string>"

Private conn As ADODB.Connection
Private cmd As ADODB.Command
Private recAff As Long
______________________________________________________________
Private Sub Class_Initialize()
Set conn = New ADODB.Connection
Set cmd = New ADODB.Command

conn.Open DB_CONNECTION_STRING

With cmd
    .ActiveConnection = conn
    .CommandTimeout = 0
End With
End Sub
...
<more properties/methods>
...
Public Sub LocalizeOutput(fetchSQL As String, InputTableName As String)
'If the InputTableName does not exist, a new table will be created. All fields will be datatyped as Text
'Otherwise, if the InputTableName does exist, data will be appended. Caller is responsible for handling errors

Dim rs As ADODB.Recordset
Dim XMLFilePath As String
Dim domIn As Object
Dim domOut As Object
Dim domStylesheet As Object

XMLFilePath = Environ("TEMP") & "\TableImport.xml"
fetchSQL = "SET NOCOUNT ON; " & vbNewLine & fetchSQL

Set domIn = CreateObject("Microsoft.XMLDOM")
domIn.async = False

'Execute the query
With cmd
    .CommandType = adCmdText
    .CommandText = fetchSQL
    Set rs = .Execute(recAff)
End With

Dim tbl As TableDef

'Save off the output as xml file
If FileExists(XMLFilePath) Then
    Call FileDelete(XMLFilePath)
End If
rs.Save XMLFilePath, adPersistXML

'Write the XML Transformation File
Call WriteXSLTransform(InputTableName)

'Convert the ado_xml file into an Access readable xml file
domIn.Load XMLFilePath

Set domStylesheet = CreateObject("Microsoft.XMLDOM")
domStylesheet.Load Environ("TEMP") & "\ADOXMLToAccess.xsl"

Set domOut = CreateObject("Microsoft.XMLDOM")
domIn.transformNodeToObject domStylesheet, domOut

'Set domIn = Nothing
Call FileDelete(XMLFilePath)

'Save the output
domOut.Save XMLFilePath

'Import the saved document into Access
Application.ImportXML XMLFilePath, acAppendData

'clean up
Call FileDelete(XMLFilePath)
Call FileDelete(Environ("TEMP") & "\ADOXMLToAccess.xsl")
Set rs = Nothing
Set domIn = Nothing
Set domOut = Nothing
Set domStylesheet = Nothing

End Sub
Private Const DB_CONNECTION_STRING As STRING=“”
作为ADODB.连接的专用连接
私有cmd作为ADODB.Command
二等兵长
______________________________________________________________
私有子类_Initialize()
Set conn=新的ADODB.连接
Set cmd=New ADODB.Command
连接打开数据库连接字符串
使用cmd
.ActiveConnection=conn
.CommandTimeout=0
以
端接头
...
...
公共子本地化输出(fetchSQL作为字符串,InputableName作为字符串)
'如果InputableName不存在,将创建一个新表。所有字段都将数据类型化为文本
'否则,如果InputableName确实存在,将追加数据。呼叫方负责处理错误
将rs设置为ADODB.Recordset
Dim XMLFilePath作为字符串
作为对象的Dim domIn
将domOut变暗为对象
将样式表作为对象
XMLFilePath=Environ(“TEMP”)和“\TableImport.xml”
fetchSQL=“SET NOCOUNT ON;”&vbNewLine&fetchSQL
Set domIn=CreateObject(“Microsoft.XMLDOM”)
domIn.async=False
'执行查询
使用cmd
.CommandType=adCmdText
.CommandText=fetchSQL
设置rs=.Execute(重新设置)
以
将tbl变暗为TableDef
'将输出另存为xml文件
如果文件存在(XMLFilePath),则
调用FileDelete(XMLFilePath)
如果结束
rs.Save XMLFilePath,adPersistXML
'编写XML转换文件
调用WriteXSLTransform(InputableName)
'将ado_xml文件转换为Access可读的xml文件
domIn.Load XMLFilePath
Set domStylesheet=CreateObject(“Microsoft.XMLDOM”)
domStylesheet.Load环境(“TEMP”)和“\adommltoaccess.xsl”
Set domOut=CreateObject(“Microsoft.XMLDOM”)
domIn.transformNodeToObject domStylesheet,domOut
'设域=无
调用FileDelete(XMLFilePath)
'保存输出
保存XMLFilePath
'将保存的文档导入Access
Application.ImportXML XMLFilePath,acAppendData
“清理
调用FileDelete(XMLFilePath)
调用FileDelete(Environ(“TEMP”)和“\adommltoaccess.xsl”)
设置rs=无
设置域=无
出发=什么也没有
Set domStylesheet=Nothing
端接头

StoredProcess不适合您?存储过程->Passthrou->“生成表查询”…?你们说得对。SP是通往这里的道路。谢谢你帮我找到了一个显而易见的答案。