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



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

每当我尝试执行这样的东西时:

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

MS Access抛出错误:

CREATE TABLE语句中的语法错误。

无进一步信息。

Access SQL不支持一次执行多个SQL语句,因此#temp表的概念并不真正适用。如果你需要一张临时桌子,那么你需要
  • 创建一个"真实"表
  • 用它做你的工作,然后
  • 完成后删除(放下)表

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

包括:

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

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

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

步骤:

1-将SQL语句或整个过程存储在txtfile中。为了缩短VBA代码,它需要

  • sql语句用分号关闭;然后是换行

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

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

2-调用例行

Sub SubRunSQL()
On Error Resume Next
droptemptables
On Error GoTo 0
runSQL CurrentProject.path & "_sqlp01.sql"
End Sub

3-关闭+删除"临时"表(在我的例子中,标签为前缀"tmp",bc Access在表名中的#字符有问题,即:表名必须放在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

据我所知,没有办法在Access Query Designer中执行像您问题中那样的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工作。

试试这个

SELECT*
INTO Temp1
FROM TableName;

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

使用SELECT语句检查结果:

SELECT*
FROM Temp1;

如果添加,这将起作用

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

最新更新