在我的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
将它们合并,这样就成了一个大问题。
所有这些都给了我一些问题。我认为这是一件很平常的事情,除了我已经尝试过的东西之外,我不确定如何解决它。
修改 当我尝试创建一个临时表并插入(或从中选择)时,我被告知临时表名是无效的对象。
答案 0 :(得分:1)
如何将动态查询输出到临时表。然后你可以像任何其他表一样引用输出。
动态查询:
SELECT x,y,z
INTO #MyTempTable
...
最终查询:
SELECT *
FROM TABLE
JOIN #MyTempTable ON ...
答案 1 :(得分:1)
你的问题比看上去有些困难。问题源于你有一个格式未知的表(动态生成的列)。
包含仅在运行时已知的列的表强制解决方案既复杂又繁琐,或者解决方案不理想。
您选择的全局临时表解决方案可能是最简单的解决方案之一,但请查看此处(跳至“全局临时表”或搜索“##”)以了解您所选解决方案的一些缺陷: http://www.sommarskog.se/share_data.html
简短的回答是没有良好的方法。
答案 2 :(得分:0)
我得到了这个工作。我所做的是使用全局临时表。这样我可以在多个execute
语句中使用它,而不是使用普通的临时表。这样我也可以加入全局临时表。请记住,每个过程使用一个唯一的ID,以便您可以告诉您当前正在使用哪些行,因为这可以在多个过程中看到。这样我也可以在最后删除行(基于id)。