【问题标题】:Import MS-SQL data into an Access Table ADO将 MS-SQL 数据导入 Access 表 ADO
【发布时间】:2022-01-09 16:47:07
【问题描述】:

我希望您能帮助我或为我指明正确的方向。多年来,我一直使用一种非常简洁的方法将数据(在 VB6 中,是的!)从 MS-SQL 表导入到 MS-Access 数据库/表中,如下所示:-

没有内部连接的工作查询

Dim myConnection As ADODB.connection
Dim mySQL As String
Set myConnection = New ADODB.connection
myConnection.Open "Driver={Microsoft Access Driver (*.mdb)};" & "Dbq=DB1.mdb;" & "DefaultDir=C:\Temp;" & "Uid=Admin;Pwd=;"
mySQL = "SELECT * INTO [Xray] FROM [ODBC;Driver=SQL Server; SERVER=myServer;DATABASE=myDatabase;UID=myUID;PWD=myPassword;].[ShipTo] WHERE [ShipTo].Company='ABC001'"
myConnection.Execute mySQL
Set myConnection = Nothing

但是,我现在第一次需要开始使用内部联接。我以为我可以像上面那样简单地做一些事情,但是我已经陷入困境并且不知道如何进步。我的内部连接查询如下:-

SELECT        
    dbo.InvcHead.InvoiceNum AS DocNum, 
    SUM(dbo.InvcTax.TaxAmt) AS DocTaxAmt
FROM                        
    dbo.InvcTax
        INNER JOIN
    dbo.InvcHead ON (dbo.InvcTax.InvoiceNum = dbo.InvcHead.InvoiceNum) 
GROUP BY 
dbo.InvcHead.InvoiceNum**

由于我明显缺乏使用经过尝试和测试的方法的连接的经验,我收到一个错误,这可能是因为我的语法,但我只是看不到光。下面是新的连接字符串/查询尝试:-

内连接查询失败

Dim myConnection As ADODB.connection
Dim mySQL As String

Set myConnection = New ADODB.connection
myConnection.Open "Driver={Microsoft Access Driver (*.mdb)};" & "Dbq= DB1.mdb;" & "DefaultDir= C:\Temp;" & "Uid=Admin;Pwd=;"

mySQL = ""
mySQL = mySQL & "SELECT "
mySQL = mySQL & "dbo.InvcHead.InvoiceNum AS DocNum, "
mySQL = mySQL & "SUM(dbo.InvcTax.TaxAmt) As Doctaxamt "
mySQL = mySQL & "INTO [Xray] FROM [ODBC;Driver=SQL Server; SERVER= myServer;DATABASE= myDatabase;UID= myUID;PWD=myPassword;].[dbo.InvcTax] "
mySQL = mySQL & "Inner Join dbo.InvcHead ON (dbo.InvcTax.InvoiceNum = dbo.InvcHead.InvoiceNum)"
mySQL = mySQL & "Group By dbo.InvcHead.Invoicenum"

myConnection.Execute mySQL
Set myConnection = Nothing

我收到的错误消息是“连接操作中的语法错误”

是否可以通过内部连接查询使用此方法进行提取?我怀疑我的问题与我引用连接的第一个表的脚本区域有关。

.[dbo.InvcTax] "

如果这是不可能的,有没有办法动态地创建一个表(就像我所做的那样),而是从一个记录集中?

我们将不胜感激任何引导正确方向的帮助。

谢谢, 杰克

【问题讨论】:

  • 仅供参考3+ part naming on Columns will be Deprecated,应该避免。您最好在FROM 中为您的对象添加别名并使用它们来限定您的列。这样可以避免使用将在未来版本中弃用并可能删除的功能,并使您的代码更加简洁和可读。
  • 您好 Larnu,非常感谢您提供的信息。这是我要做的第一件事并在转换后,再次测试以查看它是否有帮助。感谢您的反馈。
  • 这不太可能解决您的错误,我更多的是指出您使用的是弃用列表中的语法。
  • 就像已经提到的那样,使您的查询更具可读性,例如像这样 SELECT h.InvoiceNum AS DocNum, SUM(t.TaxAmt) AS DocTaxAmt FROM dbo.InvcTax t INNER JOIN dbo.InvcHead h ON t .InvoiceNum = h.InvoiceNum GROUP BY h.InvoiceNum 它不会修复您的错误,但可以帮助我们和其他人帮助您

标签: sql-server ms-access vb6 inner-join ado


【解决方案1】:

Access SQL 中的 dbo 前缀失败,您错过了第二个表的数据库引用:

mySQL = ""
mySQL = mySQL & "SELECT "
mySQL = mySQL & "T1.InvoiceNum AS DocNum, "
mySQL = mySQL & "SUM(T1.TaxAmt) As Doctaxamt "
mySQL = mySQL & "INTO [Xray] FROM [ODBC;Driver=SQL Server;SERVER=myServer;DATABASE=myDatabase;UID=myUID;PWD=myPassword;].dbo.InvcTax AS T1 "
mySQL = mySQL & "INNER JOIN [ODBC;Driver=SQL Server;SERVER=myServer;DATABASE=myDatabase;UID=myUID;PWD=myPassword;].dbo.InvcHead AS T2 ON (T1.InvoiceNum = T2.InvoiceNum)"
mySQL = mySQL & "Group By T2.Invoicenum"

【讨论】:

  • 古斯塔夫,非常感谢!现在看来,这似乎很合乎逻辑,但当然,我根本没有那种逻辑。我现在收到一个未找到字段的错误,但会继续这样做,因为这显然是一个好兆头 - 非常感谢!
  • 快速更新,“找不到字段”错误的问题与 InvcHead 中的大小(列数)有关。未经证实,但将 InvcTax 单独编写到 Access 中可以正常工作,但我在尝试单独执行 InvcHead 时收到错误消息。这意味着连接没有问题,但是表的大小有问题。如果我删除“插入”,则连接完美。现在不知道如何将记录集中的内容放入另一个表中。可能需要创建一个较小的版本,然后从 temp 运行:-( 非常感谢关于 Joins 的知识分享
  • Access 对一个表/查询有 255 个字段的限制。如果您的表有更多字段,您可能必须创建仅提取所需字段的简单选择查询,然后使用这些查询来构建您的最终查询。
  • 再次感谢 Gustav,我就是这样做的,而且加入也很有效。再次感谢。现在需要使用您提供的知识共享添加额外的连接。干杯先生。
  • 您好 Gustav,我对此还有另一个问题。由于我是 Stack Overflow 的新手,这个新问题应该作为另一个线程发布,还是我可以使用这个线程并添加到它?提前致谢,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多