向 SQL Server 抛出查询时,如何在 Access 中留下 SQL 注释?

Posted

技术标签:

【中文标题】向 SQL Server 抛出查询时,如何在 Access 中留下 SQL 注释?【英文标题】:How to leave SQL comments in Access when queries are throw to SQL Server? 【发布时间】:2020-06-16 15:36:49 【问题描述】:

我们有一个以 Access 形式访问 SQL Server 的应用程序。我们希望将 SQL 的注释保留在查询的 SQL 代码中,但是此代码会引发异常 (3075):

Dim strSQL As String
Dim dbs As DAO.Database
Set dbs = CurrentDb
strSQL = "SELECT /* 123456 */ NAA_CODE_NATURE_PK, NAA_LIBELLE_NATURE FROM RGZ_NATURES_AFFAIRE ORDER BY NAA_LIBELLE_NATURE"
Set rs = dbs.OpenRecordset(strSQL, dbOpenSnapshot)

我们已经尝试过 dbExecDirect, dbSQLPassThrough 最后是 dbExecDirect + dbSQLPassThrough 作为 OpenRecordset 方法的第三个参数,但这根本不起作用...

有什么办法吗?

谢谢

【问题讨论】:

我认为该查询没有任何问题。你说它抛出异常,完整的异常是什么? 3075 本身意义不大。 in 法语 "erreur de syntaxe (opérateur 缺席) dans l'expression "/* toto */ NAA_CODE_NATURE_PK" 英文“表达式中的语法错误(无运算符)”... 【参考方案1】:

它适用于 Pass-Through 查询(并且适用于此),但不像您尝试过的那样。

您不能在 Access SQL 中使用 cmets,只能使用 crude workarounds。

最好的方法是使用 querydef 对象来设置连接字符串。

Sub TestSqlComment()

    Dim DB As DAO.Database
    Dim QD As DAO.QueryDef
    Dim RS As DAO.Recordset
    Dim strSQL As String

    Set DB = CurrentDb
    Set QD = DB.CreateQueryDef("")
    ' Set connect string of Pass-Through query to the connect string of an existing linked table
    QD.Connect = DB.TableDefs("RGZ_NATURES_AFFAIRE").Connect

    strSQL = "SELECT /* 123456 */ NAA_CODE_NATURE_PK, NAA_LIBELLE_NATURE FROM RGZ_NATURES_AFFAIRE ORDER BY NAA_LIBELLE_NATURE"
    QD.Sql = strSQL 
    Set RS = QD.OpenRecordset(dbOpenSnapshot)
    Debug.Print RS(0)
    RS.Close

End Sub

当然,您可以将所有这些开销转移到返回记录集的辅助函数中。

还应注意,传递查询是只读的,因此这对于表单的用途可能有限。

【讨论】:

嗯...没有简单的解决方案,因为我们不能以这种方式重写所有应用程序代码,并且将记录集设置为只读模式将无法操作... 那么你的问题的答案是:你不能。,或者使用“解决方法”之一。 -- 如果您的 SQL 代码在 VBA 中,那么显而易见的解决方案是将 cmets 放在 VBA 中。 @SQLpro 我们需要让这些 cmets 通过 SQL Server 才能在 SQL Server profiler 中看到它们...... 您正在寻找不可能的东西。即使 Access SQL 支持 cmets,它们也会在 Access、ODBC 驱动程序和服务器之间被过滤掉。只有 PT 查询按原样发送到服务器(使用 cmets),但它们的结果是 read-only。 @SQLpro 我认为唯一的方法是添加一个错误的 WHERE 子句,其内容类似于 1 = 1,但带有一些 GUID...【参考方案2】:

如何声明 rs?它应该是 DAO.Recordset,就像您的 DAO.Database 声明一样。完整的代码如下:

Dim strSQL As String
Dim dbs As DAO.Database
DIM rs As DAO.Recordset ' adding this line
Set dbs = CurrentDb
strSQL = "SELECT /* 123456 */ NAA_CODE_NATURE_PK, NAA_LIBELLE_NATURE FROM RGZ_NATURES_AFFAIRE ORDER BY NAA_LIBELLE_NATURE"
Set rs = dbs.OpenRecordset(strSQL, dbOpenSnapshot)

该错误可能是因为 Access 正在尝试使用 ADO 版本的记录集。

【讨论】:

我就是这么做的

以上是关于向 SQL Server 抛出查询时,如何在 Access 中留下 SQL 注释?的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 函数向存储过程抛出异常

如何从程序向 Sql Server 和 MySql 发送查询?

如何从XML *向SQL Server DATE字段*中插入NULL

如何从 SQL Server CE 表中删除一行?

SQL Server 抛出和事务

如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?