MS Access 数据库 (2010) 如何从查询设计器创建临时 table/procedure/view
MS Access database (2010) how to create temporary table/procedure/view from Query Designer
有什么方法可以使用查询设计器在 MS Access 数据库 (2010) 中创建临时 table/view/stored 过程?
每当我尝试执行这样的操作时:
SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)
MS Access 抛出错误:
Syntax error in CREATE TABLE statement.
没有更多信息。
据我所知,无法在 Access 查询设计器中执行 SQL 语句,就像您问题中的语句一样,因为它期望每个语句都是 View/Procedure 或函数定义。
您的陈述存在普遍问题。在 FROM 子句中使用 subselect/derived table 时,您必须为返回的结果使用别名。这将在 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 不支持一次执行多个 SQL 语句,因此 #temp table 的概念并不适用。如果您需要临时 table 那么您需要
- 创建 "real" table,
- 用它做你的工作,然后
- 完成后删除 table。
虽然这个问题已经回答了一年,但我希望以下方法可能对像我一样试图以务实的方式弥补 MS Access 缺点并希望专注于实际的其他人有所帮助 sql-查询。
它涵盖:
运行存储在文本文件中的易于阅读的 sql 过程(在 VBA 中使用连接字符串对它们进行编码的常见解决方案变得不方便且困难很快)
使用 "temporary" tables。请注意,此解决方案不会阻止 "bloating up" 中的 accdbs - 因此它们仍然必须不时压缩。如果您选择 运行 临时数据库中的过程,则可以避免这种情况,这需要一些额外的编码和错误处理。
(我使用带有以下代码的空 accdb 作为模板,然后从那里开始工作,例如,如果需要额外的 VBA-例程或表格。)
步骤:
1 - 将您的 SQL 语句或整个过程存储在一个 txt 文件中。
为了保持 VBA-code 简短,它需要
sql 语句以分号结束;然后是换行符
注释行跨越整行,这意味着在 /* 之前和/*/
之后没有额外的内联字符
OP obv。可以访问 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 - 关闭 + 删除 "temporary" 表(在我的例子中标有前缀 "tmp",bc Access 在 table 名称中的 # 字符有问题 - 即:table名称必须放在 sql 中的 [括号] 中,这会导致在循环中删除那些 table 时出现问题。
将它包装在 "resume next" 中一点也不优雅,但在我的例子中,它被证明是最可靠的解决方案(目标是编码实际的 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
试试这个
SELECT*
INTO Temp1
FROM TableName;
注意: 你应该有一个现有的 table,你想从中创建你的临时 table。
使用 SELECT 语句检查结果:
SELECT*
FROM Temp1;
如果您添加:
,这将起作用
SET NOCOUNT ON
SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)
有什么方法可以使用查询设计器在 MS Access 数据库 (2010) 中创建临时 table/view/stored 过程?
每当我尝试执行这样的操作时:
SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)
MS Access 抛出错误:
Syntax error in CREATE TABLE statement.
没有更多信息。
据我所知,无法在 Access 查询设计器中执行 SQL 语句,就像您问题中的语句一样,因为它期望每个语句都是 View/Procedure 或函数定义。
您的陈述存在普遍问题。在 FROM 子句中使用 subselect/derived table 时,您必须为返回的结果使用别名。这将在 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 不支持一次执行多个 SQL 语句,因此 #temp table 的概念并不适用。如果您需要临时 table 那么您需要
- 创建 "real" table,
- 用它做你的工作,然后
- 完成后删除 table。
虽然这个问题已经回答了一年,但我希望以下方法可能对像我一样试图以务实的方式弥补 MS Access 缺点并希望专注于实际的其他人有所帮助 sql-查询。
它涵盖:
运行存储在文本文件中的易于阅读的 sql 过程(在 VBA 中使用连接字符串对它们进行编码的常见解决方案变得不方便且困难很快)
使用 "temporary" tables。请注意,此解决方案不会阻止 "bloating up" 中的 accdbs - 因此它们仍然必须不时压缩。如果您选择 运行 临时数据库中的过程,则可以避免这种情况,这需要一些额外的编码和错误处理。
(我使用带有以下代码的空 accdb 作为模板,然后从那里开始工作,例如,如果需要额外的 VBA-例程或表格。)
步骤:
1 - 将您的 SQL 语句或整个过程存储在一个 txt 文件中。 为了保持 VBA-code 简短,它需要
sql 语句以分号结束;然后是换行符
注释行跨越整行,这意味着在 /* 之前和/*/
之后没有额外的内联字符
OP obv。可以访问 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 - 关闭 + 删除 "temporary" 表(在我的例子中标有前缀 "tmp",bc Access 在 table 名称中的 # 字符有问题 - 即:table名称必须放在 sql 中的 [括号] 中,这会导致在循环中删除那些 table 时出现问题。
将它包装在 "resume next" 中一点也不优雅,但在我的例子中,它被证明是最可靠的解决方案(目标是编码实际的 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
试试这个
SELECT*
INTO Temp1
FROM TableName;
注意: 你应该有一个现有的 table,你想从中创建你的临时 table。
使用 SELECT 语句检查结果:
SELECT*
FROM Temp1;
如果您添加:
,这将起作用SET NOCOUNT ON
SELECT * INTO #temp_table
FROM (SELECT column_1, column_2 FROM table)