在sql存储过程中将可执行字符串与主sql组合在一起

时间:2012-04-12 18:20:50

标签: sql-server-2008

在我的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将它们合并,这样就成了一个大问题。

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

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

3 个答案:

答案 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)。