MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图

Posted

技术标签:

【中文标题】MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图【英文标题】:MS Access database (2010) how to create temporary table/procedure/view from Query Designer 【发布时间】:2015-04-17 11:43:31 【问题描述】:

有什么方法可以使用查询设计器在 MS Access 数据库 (2010) 中创建临时表/视图/存储过程?

每当我尝试执行这样的事情时:

SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)

MS Access 抛出错误:

CREATE TABLE 语句中的语法错误。

没有更多信息。

【问题讨论】:

【参考方案1】:

Access SQL 不支持一次执行多个 SQL 语句,因此 #temp 表的概念并不真正适用。如果你需要一个临时表,那么你需要

创建一个“真实”表, 用它做你的工作,然后 完成后删除(删除)表格。

【讨论】:

【参考方案2】:

虽然这个问题已经回答了一年,但我希望以下方法可能对像我一样试图以务实的方式弥补 MS Access 缺点并希望专注于实际 sql 查询的其他人有所帮助。

涵盖:

运行存储在文本文件中的易于阅读的 sql 过程(在 VBA 中使用串联字符串对它们进行编码的常见解决方案很快就会变得不方便和困难)

使用“临时”表。请注意,此解决方案不能防止 accdbs “膨胀” - 因此它们仍然需要不时压缩。如果您选择在临时数据库中运行过程,则可以避免这种情况,这需要一些额外的编码和错误处理。

(我使用带有以下代码的空 accdb 作为模板,然后从那里开始工作,例如,如果需要额外的 VBA 例程或表单。)

步骤:

1 - 将您的 SQL 语句或整个过程存储在 txt 文件中。 为了保持 VBA 代码简短,它需要

sql 语句以分号结束;后跟一个换行符

注释行跨越整行,这意味着在 /* 之前和 */ 之后没有额外的内联字符

OP 观察。可以访问 sql 编辑器,其他人可能没有。但是:即使在公司环境中,您通常也应该能够使用一些带有 SQL 突出显示的免费文本编辑器(例如 notepad++,它突出显示带有 .sql 扩展名的文件中的语法)。

2 - 调用例程

Sub SubRunSQL()
On Error Resume Next
droptemptables
On Error GoTo 0

runSQL CurrentProject.path & "\_sql\p01.sql"

End Sub

3 - 关闭 + 删除“临时”表(在我的情况下标有前缀“tmp”,bc Access 在表名中的 # 字符存在问题 - 即:表名必须放在 [brackets] 中sql,这会导致在循环中删除这些表时出现问题)。

将它包装在“继续下一个”中并不优雅,但在我的例子中,它被证明是最强大的解决方案(目标是实际 SQL 代码的编码,而不是围绕它的一些 UI。)

Sub droptemptables()
Dim tdf As TableDef
For Each tdf In CurrentDb.TableDefs
    If tdf.Name Like "tmp*" Then
        DoCmd.Close acTable, tdf.Name, acSaveNo
        DoCmd.DeleteObject acTable, tdf.Name
    End If
Next tdf
End Sub

4 - 获取 SQL 过程并在循环中处理单个语句。

Sub runSQL(path As String)

Dim dbs As DAO.Database
Set dbs = CurrentDb

Dim sql As String
sql = fetchSQL(path)

' optional: replace some string in your textfile with a public declared variable (here: Public Const dwh As String = "'I:\mydwh.accdb'")
sql = Replace(sql, "#dwh", dwh)

' Split at semicolon + carriage left
Dim arrsql() As String
arrsql() = Split(sql, ";" & vbNewLine)

' Loop through the SQL-Statements
Dim i As Integer
For i = LBound(arrsql()) To UBound(arrsql())
    Debug.Print arrsql(i)
    dbs.Execute arrsql(i), dbFailOnError
Next i
End Sub

5 - 将文本文件的内容作为字符串返回的标准函数。 在这种情况下,我也会跳过注释行,如果您选择不注释您的 sql,这是多余的。

Function fetchSQL(path As String) As String

Dim skpLine As Boolean
Dim Line As String
Dim iFile As Integer
iFile = FreeFile
Open path For Input As #iFile

' skip commented lines /* ... */
Do Until EOF(iFile)
    Line Input #iFile, Line
    If Left(Line, 2) = "/*" Then skpLine = True
    If skpLine = False Then fetchSQL = fetchSQL & vbNewLine & Line
    If Right(Line, 2) = "*/" Then skpLine = False
Loop
Close #iFile
End Function

【讨论】:

另一种需要更多 VBA 的方法可能是使用 csv 文件(+自动生成的 schema.ini 文件)作为临时表 - 对于较大的文件,性能可能会超慢,但它可以防止 accdb 膨胀【参考方案3】:

据我所知,没有办法在 Access 查询设计器中执行您的问题中的 SQL 语句,因为它希望每个语句都是视图/过程或函数定义。

您的陈述存在一般性问题。在 FROM 子句中使用子选择/派生表时,您必须为返回的结果使用别名。这将在 SQL Server Management Studio 中工作:

SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table) AS someAlias

我建议在开发 Access Data Project (ADP) 应用程序时使用 SQL Server Management Studio(或类似工具)来完成大部分 SQL 工作。

【讨论】:

“我建议在开发 Access 应用程序时使用 SQL Server Management Studio ...完成大部分 SQL 工作。” - 这是个糟糕的建议。 Access SQL 和 T-SQL 之间存在显着差异,因此适用于 SSMS 的查询不一定适用于 Access。 @Gord:感谢您的提示。基于视图+存储过程的上下文,我假设一个访问数据项目。我澄清了我在这方面的建议。 问题本身是关于 Access SQL 而不是关于 T-SQL。我知道如何在 T-SQL 中完成我需要的东西,但我想弄清楚如何让它们在 Access Sql 中工作【参考方案4】:

试试这个

SELECT*
INTO Temp1
FROM TableName;

注意:您应该有一个要从中创建临时表的现有表。

使用 SELECT 语句检查结果:

SELECT*
FROM Temp1;

【讨论】:

【参考方案5】:

如果您添加以下内容,这将起作用:

SET NOCOUNT ON
SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)

【讨论】:

但是 MS Access 不允许多个 Select 语句

以上是关于MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在拆分数据库中将表从前端链接到后端(MS Access 2010)

如何防止最终用户在 MS Access 2010 应用程序中从前端查看后端数据?

如何将 java 连接到 Ms Access 2010?

如何在 MS Access 2010 中的单元格中显示空值

在 ms access 2010 中将查询结果插入表中

如何在 MS Access 2010 中组合多种查询类型?