【问题标题】:What is Ad Hoc Query?什么是临时查询?
【发布时间】:2010-03-17 09:15:32
【问题描述】:

我正在阅读一本关于 SQL 的书。在那本书中有一个术语Ad Hoc Query,我不明白。

什么是即席查询?

【问题讨论】:

    标签: sql adhoc-queries


    【解决方案1】:

    Ad hoc 是拉丁文的“为此目的”。您可以将其称为“即时”查询或“就这样”查询。这是一种您只需在需要的地方随意输入的 SQL 查询

    var newSqlQuery = "SELECT * FROM table WHERE id = " + myId;
    

    ...根据myId 的值,每次执行该行代码时都是一个完全不同的查询。与即席查询相反的是预定义查询,例如存储过程,您在其中创建了一个查询,用于从该表中进行选择(例如)的整个通用目的,并将 ID 作为变量传递。

    【讨论】:

    • @David Hedlund 您的查询容易受到SQL injection attacks...您必须使用参数。
    • @Paridokht:当然可以。我不是在提倡这种用法,而是在解释临时查询的概念,这就是问题所在。
    • @DavidHedlund:是的,我明白..但可能最好在您的回答中提及它,因为有些用户阅读了这篇文章并且对这种攻击一无所知。
    • 如果用户阅读了它并且对 SQL 注入一无所知,那么他们就没有在做任何黑客可能感兴趣的事情。我们不要走极端......
    • 作为一名拥有多年经验的开发人员,我在寻找与我所寻找的完全不同的东西时学到了很多东西。所以恕我直言,添加一个句子就像'...不要忘记在这里为myId做必要的控制和清理'不会造成任何伤害。
    【解决方案2】:

    即席查询是在发出查询之前无法确定的查询。它是为了在需要时获取信息而创建的,它由动态构造的 SQL 组成,通常由桌面驻留的查询工具构造。

    检查:http://www.learn.geekinterview.com/data-warehouse/dw-basics/what-is-an-ad-hoc-query.html

    【讨论】:

    • 所以如果我键入一个静态查询并运行一次,它就不是“临时的”?
    【解决方案3】:

    即席查询是为了从数据库服务器上可用的任何或多个合并表中提供特定记录集而创建的。这些查询通常仅用于一次性用途,可能不需要合并到任何存储过程中以在将来再次运行。

    临时场景:您收到对具有一组唯一变量的特定数据子集的请求。如果没有可以提供必要结果的预先编写的查询,则必须编写 Ad-hoc 查询来生成记录集结果。

    除了一次性使用的即席查询之外,还有存储过程;即存储在 DB 接口工具中的查询。然后可以在模块或宏中按顺序执行这些存储过程,以按需、按计划或由另一个事件触发来完成预定义的任务。

    存储过程场景:每个月您都需要从相同的表集和相同的变量生成报告(这些变量可能是特定的预定义值、计算值,例如“结束当前月”,或用户的输入值)。您将在第一次将过程创建为临时查询。在测试结果以确保准确性后,您可以选择部署此查询。然后,您可以将查询或一系列查询存储在模块或宏中,以便根据需要再次运行。

    【讨论】:

      【解决方案4】:

      即席查询是在发出查询之前无法确定的查询。它是为了在需要时获取信息而创建的,它由动态构造的 SQL 组成,通常由桌面驻留的查询工具构造。 即席查询不驻留在计算机或数据库管理器中,而是根据数据用户的需要动态创建。

      在 SQL 中,即席查询是一种松散类型的命令/查询,其值取决于某个变量。每次执行命令时,结果都是不同的,具体取决于变量的值。它无法预先确定,通常属于动态编程 SQL 查询。即席查询是短暂的,是在运行时创建的。

      【讨论】:

        【解决方案5】:

        即席查询是那些尚未定义但不需要定期进行的查询,因此它们不包含在典型的报告或查询集中

        【讨论】:

        • 你能解释一下你在写什么吗?什么是“典型集合”;你的意思是编译后的代码?
        【解决方案6】:

        Ad-hoc Statments 只是 T-SQL 语句,它有一个 Where 子句,而 Where 子句实际上可以有如下文字:

        Select * from member where member_no=285;
        

        或变量:

        declare @mno INT=285;
        Select * from member where member_no=@mno
        

        【讨论】:

          【解决方案7】:

          即席查询 -

          • 这种类型的查询是为“特定目的”而设计的,这与预定义查询不同,预定义查询在每次执行时都具有相同的输出值。
          • 每次执行一个即席查询命令,但结果不同,具体取决于变量的值。
          • 无法预先确定,通常属于动态编程 SQL 查询。
          • 即席查询是短暂的,是在运行时创建的。

          【讨论】:

            【解决方案8】:

            还想补充一点,即席查询容易受到 SQL 注入攻击。我们应该尽量避免使用它,而是使用参数化 SQL (like PreparedStatement in Java)。

            【讨论】:

            • 即席查询不易易受 SQL 注入攻击。接受用户输入的未参数化查询易受 SQL 注入攻击。
            • @Ben 即席查询始终未参数化。如果我们不将变量暴露给用户,就不会被SQL注入攻击;但关键是即席查询对 SQL 注入有风险。
            【解决方案9】:

            即席查询是:

            1. 预先计划好的问题。
            2. 预先安排的问题。
            3. 一时兴起的问题。
            4. 不会返回任何结果的问题。

            【讨论】:

            • 这在 SQL 中是什么意思?此外,并非所有“不会返回任何结果的问题”。是临时的。
            【解决方案10】:

            即席查询是一种计算机定义。这意味着此查询是专门设计用于在仅需要时获取任何信息。预定义。 参考这个https://www.youtube.com/watch?v=0c8JEKmVXhU

            【讨论】:

            • 我认为“预定义”与“临时”相反。
            【解决方案11】:

            在 Sql Server 中,“Ad Hoc Query”也用于 Ad Hoc 分布式查询。这些是通过 OpenRowset 或 OpenDatasource 在其他服务器上的即席查询。仅在配置后才允许使用 Ad Hoc 分布式查询。这是一个服务器配置选项。

            【讨论】:

            • 这与 sql Server 无关。问题不是关于特定的企业解决方案,而是关于对临时查询含义的一般理解
            猜你喜欢
            • 1970-01-01
            • 2015-06-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-19
            • 1970-01-01
            • 1970-01-01
            • 2020-09-25
            相关资源
            最近更新 更多