【问题标题】:Combining an executable string with the main sql in an sql stored procedure在 sql 存储过程中将可执行字符串与主 sql 组合
【发布时间】:2012-04-12 18:20:50
【问题描述】:

在我的 sql 过程中,我创建了一个临时表,然后对其进行旋转。这是动态的,所以最后我不知道有多少列。让我们制作这张桌子:

equipmentID   |   Name1   |   Name2   | Name3
1             |   34.54   |   21.23   | 213.65
2             |   334     |   23.421  | 23.12
3             |   43.4    |   2.34    | 23.41

用于生成它的查询存储在一个字符串中,并通过调用execute(@stringQuery) 来执行。

我的另一个表是使用普通 sql 查询获取的,并生成另一组信息(包括数据透视表中包含的equipmentID

我想要做的是加入这两个表(基于equipmentID,以便存储过程返回一个表而不是两个,但我不知道该怎么做。

到目前为止,我已经尝试了几件事:

  • 保留主要(第二个)查询并将执行行添加到 FROM 部分的末尾,这样在所有表都加入后,我就有了:

    LEFT JOIN execute(@stringQuery) as strQ on strQ.equipmentID = mainQ.equipmentID

  • 将第二个查询设为字符串,以便使用execute 命令获取它们,或者创建另一个包含主 sql 的存储过程,因此(再次)它们都使用execute 命令。这确实获取了它只是没有结合它的信息。在这种情况下,我尝试将这两个执行与:

    execute('select * from (' + @query1 + ') as tbl2 left join ' + @query2 + ' as tbl1 on tbl2.equipmentID= tbl1.equipmentID')

  • 将主查询转换为字符串,然后使用LEFT JOIN 将它们组合起来,使其成为一个大查询。

所有这些都给我带来了问题。我认为这是一件常见的事情,除了我已经尝试过的方法之外,我不确定如何解决它。

编辑 当我尝试创建临时表并插入(或从中选择)时,我被告知临时表名称是无效对象。

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    如何将动态查询输出到临时表。然后你可以像任何其他表一样引用输出。

    动态查询:

    SELECT x,y,z 
    INTO #MyTempTable
    ...
    

    最终查询:

    SELECT *
    FROM TABLE
        JOIN #MyTempTable ON ...
    

    【讨论】:

    • 谢谢。我不知道为什么我没有看到。我把它弄得很复杂哈哈,我回去工作时会试试这个:D
    • 实际上我记得我已经尝试过了,但是由于数据透视产生的列数是动态的,我不得不在字符串中创建表,然后执行它。然后,每当我尝试执行该过程以使其位于数据库中时,它就不会运行,因为该表不存在。
    • @Kyra 嗯?这应该有效。临时表应该使用相同的会话构建,因此该表应该是可用的。这一切都发生在同一个会话中吗?
    • 它发生在同一个事务中。我可以在星期一的工作中再试一次。 :)
    • 请注意,当您使用“SELECT INTO”时,您不需要先显式创建表。这正是我进行类似查询的方式。另一种方法是创建全局临时表## 等,但是您需要动态创建名称以不重叠(例如使用 GUID())。不推荐,因为这种方法更简单。
    【解决方案2】:

    您的问题比看起来要难一些。问题源于您有一个格式未知的表格(动态生成的列)。

    具有仅在运行时才知道的列的表强制解决方案既复杂又麻烦,或者解决方案不理想。

    您选择的全局临时表解决方案可能是最简单的解决方案之一,但请查看此处(跳至“全局临时表”或搜索“##”),了解您选择的解决方案存在的一些缺陷: http://www.sommarskog.se/share_data.html

    简短的回答是没有好的方法可以做到。

    【讨论】:

      【解决方案3】:

      我得到了这个工作。我所做的是使用全局临时表。这样我就可以在多个execute 语句中使用它,而不是使用普通的临时表。这样我也能够加入全局临时表。请记住,为每个过程使用唯一的 id,这样您就可以知道当前正在使用哪些行,因为这可以在多个过程中看到。这样我也可以在最后删除行(基于 id)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多