0

在我的 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')

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

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

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

4

3 回答 3

1

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

包含仅在运行时才知道的列的表强制解决方案复杂且繁琐,或者解决方案不理想。

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

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

于 2012-04-19T13:19:44.087 回答
1

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

动态查询:

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

最终查询:

SELECT *
FROM TABLE
    JOIN #MyTempTable ON ...
于 2012-04-12T18:27:11.617 回答
0

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

于 2012-04-16T15:56:05.527 回答