查询引用另一个 - 访问 SQL Server

Posted

技术标签:

【中文标题】查询引用另一个 - 访问 SQL Server【英文标题】:Query References Another - Access to SQL Server 【发布时间】:2018-02-26 17:35:02 【问题描述】:

早上好,

我刚接到一项新任务,正在努力寻找合适的解决方案。我已经通过 SO 论坛和 Google 进行了搜索,但没有找到可行的解决方案。以下是我的场景:

我们正在使用 Microsoft Access 通过 ODBC 连接连接到 SQL Server 数据库。

我收到了一个非常大的直通 SQL 查询,比在 MS Access 中能够处理的还要大。在这个传递查询中,WITH...AS 方法中有一个子查询。

我希望能够将这个非常大的 SQL 传递查询拆分为两个:查询一(子查询)和查询二(引用子查询的结果)

我知道通过使用一般 Access 查询,我可以编写如下宏...

Sub myQuery()
' Edited from http://www.dbforums.com/showthread.php?1667831-Run-multiple-queries-in-sequence-on-click

' On Error GoTo ErrHandler

' Run the first query
MsgBox "Starting first query"
DoCmd.OpenQuery "first_Query"
DoEvents

' Run the second query
MsgBox "Done. Now starting second query"
DoCmd.OpenQuery "second_Query"
DoEvents

MsgBox "Done!"
End Sub

但是,这些需要是直通查询。我相信巨大的 SQL 字符串是通过大量用户输入创建的。无论如何,我无法更改给定的传递 SQL。

我是否可以编写一个宏来调用第一个传递查询,然后调用引用第一个结果的第二个传递查询?

这是我正在使用的示例...

WITH queryOne AS
    (
        SELECT fooID
        FROM tblFoo
        WHERE foodate > ...
    )

SELECT foo, fooone, footwo, foothree
FROM tblOtherFoo
WHERE fooID = OtherFooID

但是,查询是 50000+ 个字符,超过了大约 37k 的限制。

请随时提出任何问题。我对此感到困惑,并希望得到任何反馈或替代资源。

谢谢!

【问题讨论】:

一个 9,000 行长的查询是一场噩梦,并且是一个非常明显的迹象,表明某些事情已经非常糟糕了。对于初学者,我会创建一个存储过程,而不是在 Access 中执行此操作。如果您在 Access 中构建查询,则前端和后端是紧密耦合的,这不是一个好习惯。但说真的.....单个查询中有 9,000 行? 这听起来很糟糕。 9000线查询??真的。这似乎已经失控了。 @SeanLange 我没有写它,它基本上是从我们拥有的这个巨大的采购订单表中选择一堆单独的采购订单。因此,子查询获取 PO ID,第二个获取我们分析所需的其他信息。但是,它只是某些采购订单,整个字符串超过了太多字符。同样,我没有写它,不幸的是我只是试图让它工作。所以我相信你理解我的麻烦。 我已经尝试将 SQL 稍微更改为使用别名等以减少要求,但它仍然大大超过了 MS Office 产品的约 37k 左右的限制。 我知道不是你写的,但这并没有让它变得不那么可怕。说真的...... 9,000 行不是查询。这比大多数 dotnet 类甚至使用嵌入式 sql 的代码都多。假设您可以在一个页面上放置 100 行,则此查询将是 90 页。那不是询问,而是小说的前三分之一。这需要完全重新考虑和重写。我实际上是糖衣,这太可怕了。 【参考方案1】:

不清楚您所说的引用第一个或前一个的东西是什么意思?为什么要拆散你得到的一些本应很好用的东西?

因此,只需将您获得的现有 t-sql 放入存储过程即可。在 T-SQL 中,您可以轻松地让一些 SQL 对以前的一些 SQL 进行操作,但为什么要分解如此庞大的大量代码并引入错误呢?您将花费数年时间来分解为您构建和开发的已知工作的大型 T-SQL(很可能需要几年时间和一个开发团队来创建)。

保守估计,这样的常规开发成本为 50,000 美元,甚至 100,000 美元。

毫无疑问,为您提供的工作 T-SQL 可能会引用以前的数据,甚至会选择其他 T-SQL 可以处理的#Temp 表。

如果您已经获得了有效的 PT 代码和查询?

只需获取该 T-SQL 查询,然后将其粘贴到存储过程中即可。您将在 SQL Server 中执行此操作,甚至不用接触或打扰 Access。

因此,不要在 Access 中创建调用多个单独查询的宏,而是将所有 T-SQL 放在一个存储过程中,然后简单地从 Access 中调用一次巨大的混乱。

您获得的 T-SQL 可能不正确,但假设 T-SQL 是正确的,那么只需将所有冗长的混乱放入工作存储过程中即可。你不需要把这个 SQL 放在 MS Access 中,你也不需要在 Access 里面弄得一团糟。

所以让 T-SQL 在 SQL Server 中工作——在这个冗长的查询混乱在 SQL Server 中工作之前,不要打扰 MS Access。只有这样你才能启动 Access。

因此,您然后在 Access 中创建一个简单的 PT 查询,该查询调用您收到的巨大的长 T-SQL 混乱。但这个“烂摊子”应该放在 SQL Server 中,而不是放在 Access 中。

因此,在 Access 中创建一个 PT 查询,调用您的“假定”工作 T-SQL。您保存在 Access PT 查询中的 SQL 将是这样的

Exec my_StupidLongSQLProc

将以上内容另存为 PT 查询。然后在 VBA 代码中运行:

Currentdb.QueryDefs("MyPTQuery").Execute

如果你需要从 Access 传递一些值,那么去:

With CurrentDb.QueryDefs("MyPTQuery")
   .sql = "exec My_StupidLongSQLproc " & p1 & "," p2
   .Execute
End with

在上面,我们将两个 VBA 值从 Access 传递给你拥有的大杂烩——上面的存储过程只是一个访问从 Access VBA 传递的两个参数的示例。如果您获得的 T-SQL 不需要 Access 中的值,那么第一个 .execute 将完成这项工作。

如果你真的得到了一个正确的 T-SQL 这么长的例程,那么它可能已经在工作的 T-SQL 中有参数(同样你不想弄乱或改变如此巨大的长时间工作给你的 T-SQL)。

因此,您只需要在 Access 中编写一行代码,如果编写正确,您现有的长 T-SQL 可以放入存储过程中(假设您实际上得到了正确工作的 PT 查询)。

所以,如果你真的得到了一个巨大的工作 T-SQL 语句,那么只需将已知和工作的 T-SQL 作为存储过程放在 SQL Server 中,并按照上面的一行代码调用它。

因此,尝试将其与 Access 分开只会导致全球贫困,任何微小的失误或打破这一庞大的长期例行程序都会导致全球贫困和饥饿的儿童,因为您尝试“解决”此问题为您提供了出色的工作 T-SQL。如前所述,创建需要很长时间的开发团队需要大量资源。如果您触摸或破坏了一行代码并将其搞砸了,那么您需要该开发团队花费几个月的时间来修复您破坏的地方。

所以你开始打破如此巨大的混乱局面的那一刻就是你输掉这场战斗的那一刻,你会浪费几年的时间来尝试修复这个疯狂的长 T-SQL,你得到的已经声称是正确的工作代码。

【讨论】:

我从来没有说过我在使用 T-SQL,而且我不是,所以我不能做存储过程。它实际上是一个非常大的查询,有 3 个基本部分:SELECT、FROM、WHERE。 WHERE 子句有数千个 WHERE PO_ID = 'xxxx' OR PO_ID = 'xxxx' 我从来没有提到我使用的是 T-SQL,我也不能执行存储过程,因为我不是管理员。虽然我很感激你花时间写出这么长的答案,但这是粗鲁和无益的。谢谢。 您还应该看到我说我不能粘贴给我的 SQL 因为它超出了 Access 中的字符限制...这就是我在这里的原因... 好吧,如果你谈论的是一个 PT 查询,那么它必须是 T-SQL,它不能以任何其他方式工作。 PT 查询仅适用于 T-SQL。因此,如果您不打算使用 t-sql,那么您到底如何使用并谈论 PT 查询呢???再次重申:PT 查询必须是 t-sql,并且 PT 查询只能与 t-sql 一起使用。而且您不必使用存储过程。如果实际上这是 t-sql(并且它必须用于 PT 查询),则创建一个 sql 视图)。如果那个 sql 不是 t-sql,那么它就不能用于 PT 查询,那么你就必须停止谈论 PT 查询,对吧???? 不完全...您可以简单地使用MS Access界面“编写”您的查询,单击传递按钮,它变成一个传递查询...您也可以编写它使用直通语法而不使用 t-sql... 不,如果将查询更改为 pass-though,则 sql 也必须更改为 T-SQL。再说一遍:如果您使用 PT 查询,那么该查询中的 sql 必须是 T-SQL。您必须使用 100% SQL 服务器 sql(即 t-sql)。因此,任何通过逻辑谈论和发布 PT 查询的人都必须谈论 T-SQL。再来一次:PT 查询中的任何 sql 都必须是 t-sql 语法,否则它将不起作用。

以上是关于查询引用另一个 - 访问 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

通过 MS Access 例程更新 SQL Server(内部连接错误)

sql 访问另一个sql server上的表

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

如何在 SQL Server 中的 UPDATE 查询的子查询中引用表变量

sql中引用一个表的查询结果作为条件来查询另一个表如何实现?

SQL 计算 20 个工作日,删除银行存款并引用另一个查询