【问题标题】:How to create a temporary table from a SELECT query in Access VBA?如何从 Access VBA 中的 SELECT 查询创建临时表?
【发布时间】:2012-02-08 06:55:17
【问题描述】:

我正在尝试从 Access VBA 中的一个小函数方法中的查询中获取一些结果(仅供查看)。查询如下所示:

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]" & _
"SELECT [Deal Data ECM].[Deal Type]" & _
"FROM [Deal Data ECM]" & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))" & _
"GROUP BY [Deal Data ECM].[Deal Type]" & _
"PIVOT [Deal Data ECM].[Deal Region];"

这些都不起作用:

DoCmd.OpenQuery sqlstr
CurrentDb.OpenRecordset sqlstr
DoCmd.RunSQL sqlstr

我怎样才能让它工作?必须有一个简单的方法来完成这个简单的任务。我正在使用 Access 2003。

【问题讨论】:

  • 最后,您是否要从中获取结果集并将其绑定到要在您的 UI 上显示的内容?
  • 运行命令时遇到什么错误?
  • 我只想创建/覆盖一个表格,以便向正在使用该表格的人显示(然后可以对其进行更改)。
  • 我遇到的错误是由于这些命令都不适用于带有“select”和“transform”的交叉表查询。 3065 和 2342 是错误编号。

标签: sql ms-access vba ms-access-2003


【解决方案1】:

如果您查看在代码中使用Debug.Print sqlstr 或在命令窗口中使用?sqlstr 生成的字符串,您会看到

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]SELECT [Deal Data ECM].[Deal Type]FROM [Deal Data ECM]WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP BY [Deal Data ECM].[Deal Type]PIVOT [Deal Data ECM].[Deal Region];

然后你可能会注意到一个子句和下一个子句之间没有空格。

在有空格的地方添加返回使其更容易看到

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) 
    AS [CountOfDisclosed Fees (Y/N)]SELECT 
    [Deal Data ECM].[Deal Type]FROM
   [Deal Data ECM]WHERE
   ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP 
   BY [Deal Data ECM].[Deal Type]PIVOT
   [Deal Data ECM].[Deal Region];

尝试在每个结尾之前添加一个空格"

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _
"SELECT [Deal Data ECM].[Deal Type] " & _
"FROM [Deal Data ECM] " & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _
"GROUP BY [Deal Data ECM].[Deal Type] " & _
"PIVOT [Deal Data ECM].[Deal Region]; "

但是,由于您要创建一个表,因此您需要添加一个目标。通过在 select 和 from 之间添加 INTO 子句

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _
"SELECT [Deal Data ECM].[Deal Type] " & _
"INTO YourNewTable " & _
"FROM [Deal Data ECM] " & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _
"GROUP BY [Deal Data ECM].[Deal Type] " & _
"PIVOT [Deal Data ECM].[Deal Region]; "

注意:每次执行此操作都会删除旧表。另请注意,您应该使用DoCmd.RunSQL

【讨论】:

  • 我尝试了您的解决方案,但仍然没有任何命令有效。我尝试的第二个选项“CurrentDb.OpenRecordset sqlstr”是三个选项中唯一一个不返回错误的选项。但是,创建表仍然没有运气。
  • 我错过了你想要创建表格的那部分问题我已经更新了我的答案
【解决方案2】:

DoCmd.RunSQL 不能与SELECT 查询一起使用,您需要执行INSERTUPDATEDELETE

一种选择是在您的数据库中创建一个与查询输出匹配的表并执行INSERT ... SELECT ...。然后,您可以向用户显示该表。

这种方法的问题是每次再次运行查询之前都需要删除表内容。

【讨论】:

  • 我不明白的是:如果我执行 SELECT 查询,我不是刚从数据库中检索到这些记录吗?现在剩下要做的就是显示它们,人们会认为这会非常容易......必须有一种简单的方法来从 SELECT 检索到的那些行创建一个新表。
  • 您是否尝试过创建查询对象,然后将其绑定到网格或其他可以放在表单上的控件?我会考虑一下,已经晚了,如果你没有找到答案,我明天再去。祝你好运。
【解决方案3】:

您可以使用嵌套查询来创建表。我无法嵌套 sql,但如果您将查询保存为 deal_time,那么您可以使用 docmd.runSQL "select * into mytable from deal_time"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多