【问题标题】:How to execute an external .sql file pass-through query in ms-access如何在 ms-access 中执行外部 .sql 文件直通查询
【发布时间】:2020-07-12 18:22:53
【问题描述】:

我有几个通过查询设计向导创建的传递查询存储在 ms-access 中。我只是将本地 .sql 文件中的代码复制并粘贴到访问中的 sql 视图编辑器中并保存。一切运行良好。

但是,我想通过访问运行我的外部 .sql 文件。我的外部 .sql 文件位于本地文件夹中。这样,当我将某些内容更改为任一查询时,我不必更新我的外部 .sql 文件和我在 ms-access 中存储的查询。

不管怎样,我所有的传递查询都是'SELECT * FROM'

有没有办法做到这一点?

【问题讨论】:

  • 您可以使用 VBA 将外部 .sql 文件的内容读入 String,然后使用它来更新传递查询的 QueryDef 对象的 .SQL 属性.

标签: vba ms-access pass-through


【解决方案1】:

按照@GordonThompson 的建议,只需将 .sql(与任何其他编程脚本一样是文本文件)的内容读入 .SQL propertyQueryDef(引用您保存的查询)。

Sub ReadAndSaveSQL()
    Dim LoadFileStr As String
    Dim qdef As QueryDef  

    ' READ .SQL INTO A STRING VARIABLE
    With CreateObject("Scripting.FileSystemObject")
          LoadFileStr = .OpenTextFile("C:\Path\To\Script.sql", 1).readall
    End With

    ' INITIALIZE QUERYDEF
    Set qdef = CurrentDb.QueryDefs("mySavedPassThroughQuery")

    qdef.SQL = LoadFileStr                       ' REWRITE QUERY'S SQL
    qdf.Close                                    ' CLOSE AND SAVE QUERY
    Set qdef = Nothing                           ' UNINITIALIZE QUERYDEF

    DoCmd.OpenQuery "mySavedPassThroughQuery"    ' OPEN SELECT QUERY TO SCREEN
End Sub

【讨论】:

  • qdef.Close 不是必须的,设置qdef.SQL 会自动保存。
  • 这非常有效,非常感谢。另外,我通过查询以某种变量声明开始,例如:DECLARE @year As VARCHAR(4);SELECT @year = '2019;' 有没有办法修改变量中的年份?也许是 2018 年或 2017 年,而不是 2019 年
  • 删除这两个命令并在字符串上运行替换:Replace(LoadFileStr, "@year", "'2019'")。参数化不适用于使用 DAO 的传递查询。考虑ADO parameters 再次保护malicious user input。但是,ADO 不适用于 QueryDefs。
  • 嗯。我还看到 queryDef 基本上只是一个临时存储字符串的地方吗?我可以只拥有一个名为“TempQueryDef”的 queryDef,并在每次我想显示查询时为其分配一个不同的字符串。这是常见的做法吗?
  • 您可以这样做,甚至可以使用来自 SQL 的 CreateQueryDef 创建查询。但需要随后分配connection 详细信息以进行传递。因此,为什么重用相同的传递查询更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多