使用存储过程的结果加入表

时间:2016-09-07 19:26:27

标签: sql-server

我有一个存储过程,它从动态数据透视查询中返回一个数据集(这意味着数据透视列在运行时才知道,因为它们是由数据驱动的)。

此数据集中的第一列是产品ID。我想将该产品ID与另一个产品表一起加入,该产品表具有在设计时创建的各种其他列。

所以,我有一个带有产品ID列的普通表,我有一个"动态"数据集,它还具有我从调用存储过程获得的产品ID列。我怎样才能加入那些2?

1 个答案:

答案 0 :(得分:0)

动态SQL非常强大,但有一些严重的缺点。其中之一就是:您无法在 ad-hoc-SQL 中使用其结果。

将SP的结果放入表中的唯一方法是,创建一个具有拟合模式的表并使用INSERT INTO NewTbl EXEC...语法...

但还有其他可能性:

1)使用SELECT ... INTO ... FROM

在您的SP 中,当执行动态SQL时,您可以将INTO NewTbl添加到您的选择中:

SELECT Col1, Col2, [...] INTO NewTbl FROM ...

这将自动创建一个包含拟合架构的表。

您甚至可以将新表的名称作为参数传递 - 因为它是动态SQL,但在这种情况下,处理外部连接将更加困难(必须再次动态)。

如果您需要SP返回结果,只需添加SELECT * FROM NewTbl即可。这将返回与以前相同的结果集。

在SP 之外,您可以像任何普通表一样加入此表...

但是,有一个很大的但 - ups - 这听起来很讨厌 - 如果表格存在,这将失败......

因此,如果这是一个可能具有并发性的多用户应用程序,那么您必须首先删除它,这可能会导致严重的问题。

如果不是:使用IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='NewTbl') DROP TABLE NewTbl;

如果是:使用您作为参数传入的名称创建表,并使用此名称动态进行外部查询。

在此之后,您可以使用SELECT ... INTO语法...

重新创建此表

2)使用XML

XML的一个优点是,任何结构和任意数量的数据都可以填充到一个列中。

让您的SP返回一个包含一个XML列的表。您可以 - 正如您现在所知的那样 - 创建一个表并使用INSERT INTO XmlTable EXEC ...

知道会有ProductID - 元素,您可以提取此值并使用ID和依赖XML创建 2列派生表。这很容易加入。

在XQuery中使用通配符可以在不知道所有细节的情况下查询XML数据......

3)这是我的最爱:不要使用动态查询...