一个我已经知道没有漂亮答案的问题。
我有一个无法更改的第三方应用程序。应用程序的数据库已从 MS Access 转换为 SQL Server 2012。程序使用 ODBC 连接,不关心后端。它发送非常简单的 SQL,似乎在 SQL Server 上也能很好地工作。
然而,一个名为“PLAN”的表存在问题,我已经知道它是一个 SQL Server 关键字。
我知道您通常会使用方括号访问这样的表,但由于我无法更改 SQL,我想知道是否有任何“丑陋”的黑客可以覆盖关键字或即时转换 SQL。
一个我已经知道没有漂亮答案的问题。
我有一个无法更改的第三方应用程序。应用程序的数据库已从 MS Access 转换为 SQL Server 2012。程序使用 ODBC 连接,不关心后端。它发送非常简单的 SQL,似乎在 SQL Server 上也能很好地工作。
然而,一个名为“PLAN”的表存在问题,我已经知道它是一个 SQL Server 关键字。
我知道您通常会使用方括号访问这样的表,但由于我无法更改 SQL,我想知道是否有任何“丑陋”的黑客可以覆盖关键字或即时转换 SQL。
您可以尝试使用十六进制编辑器编辑第三方应用程序。如果您找到字符串 PLAN,请将其编辑为 PPAN 之类的内容,然后重命名表、视图等。如果您全部了解,它可以工作。但是,这当然是一件丑陋的事情。
我想你被搞砸了,我害怕。我可以建议的唯一其他方法是
在网络数据包到达 SQL Server 之前拦截它,这显然是相当复杂的。请参阅https://reverseengineering.stackexchange.com/questions/1617/server-side-query-interception-with-ms-sql-server并特别回答https://reverseengineering.stackexchange.com/a/1816
例如,如果它是 Java 或 .Net 应用程序,则反编译程序以更改它。
我怀疑你被水洗了。你可以
将第 3 方应用程序连接到使用链接表的 shim MS Access 数据库,其中 Access 表只不过是底层 SQL Server 表的传递。你想做的是:
完成此操作后,第 3 方应用程序应该能够像往常一样说出“Access SQL”。Access 负责对 T-SQL 的“翻译”。生活很好。我怀疑你会受到一些性能影响,因为你通过 Access 代理所有内容,但我认为它不会很大。
那将是我的首选解决方案。
另一种选择是编写一个“shim” DLL,它实现 ODBC API 并简单地包装对真正 ODBC 驱动程序的实际调用。然后在调用包装的 DLL 方法之前捕获请求并根据需要对其进行改进。棘手的部分是您的第 3 方应用程序可能会按序号位置跟踪列,或者可能按列名跟踪它们。或混合。这意味着您可能需要在返回的途中转换列名称,这可能比看起来更困难。