Dynamic 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 之外你可以像任何普通的表一样加入这个表...
但是,有一个很大的 BUT - 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-column-derived-table。这很容易加入。
在 XQuery 中使用通配符可以在不知道所有细节的情况下查询 XML 数据...
3) 这是我最喜欢的:不要使用动态查询...