在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果
Posted
技术标签:
【中文标题】在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果【英文标题】:Using result of Stored Procedure with dynamic query in another Stored Procedure with dynamic query 【发布时间】:2015-05-16 12:15:04 【问题描述】:我在创建使用用户定义类型的存储过程并构建要在存储过程结束时执行的动态查询时遇到了问题。 我以前也这样做过,但这次不同。我正在构建一个动态聚合 SELECT 语句,该语句必须(动态)调用另一个存储过程并内联使用结果。
由于其他存储过程也使用动态SQL,所以不能在用户自定义函数中定义。
我现在将展示一个 SQL 代码中的问题示例,希望对您有所帮助。
第一个存储过程:
CREATE PROCEDURE [dbo].[SP1]
...--(some uder defined types)
AS
DECLARE @SQLQuery AS NVARCHAR(MAX);
...--(some cursors used in assembling the dynamic query)
...--(at some point I have a check whether there are additional filter criteria)
SET @SQLQuery = @SQLQuery + '(SELECT COUNT([Column]) FROM [TableX]';
IF(EXISTS(SELECT TOP (1) FilterCriteria FROM @additionalCriteriaTable))
BEGIN
SET @SQLQuery = @SQLQuery = 'AND [IdOfTableX] IN (EXEC [dbo].[SP2] @param1, @param2 ...)';
END
SET @SQLQuery = @SQLQuery + ')';
存储过程 2 用于确定 [TableX] 的哪些行符合任何给定条件,也使用一些游标和动态查询。 SP2 返回这些行的 IDS。
很明显,我以错误的方式处理此问题,因为您无法从内联存储过程中进行选择。但是,您可以使用用户定义的函数,但不能使用我需要的动态 SQL。 有没有办法让存储过程的结果可以内联使用,也许是通过使用一种定义存储过程只返回特定结果集的注释形式?
我希望你们中的一些人可以帮助我,
干杯杰伦
【问题讨论】:
【参考方案1】:您可以将存储过程的结果插入到一个临时表中,然后在查询中使用该表。
类似这样的:
IF EXISTS (SELECT * FROM @additionalCriteriaTable)
BEGIN
SET @SQLQuery = '
CREATE TABLE #temp ...
INSERT INTO #temp EXEC [dbo].[SP2] @param1, @param2 ...'
+ @SQLQuery + ' AND [IdOfTableX] IN (SELECT Something FROM #temp)';
END
您只需要小心创建与存储过程结果完全相同的临时表(您不能省略任何列或更改列的顺序)。
【讨论】:
这是一个不错的建议,但是由于此检查发生在游标中,因此 #temp 中的值会经常更改。 我也想避免多个执行阶段,但似乎这是不可能的【参考方案2】:你确定这是你想要的:
In your code:
SET @SQLQuery = @SQLQuery = 'AND [IdOfTableX] IN (EXEC [dbo].[SP2] @param1, @param2 ...)';
@sqlquery 将无法正确构建。
【讨论】:
【参考方案3】:您可能会发现让调用存储过程创建一个临时表会更好,然后将其填充到嵌套调用中。它不一定是全局表才能可见,但您不能在 SP2 中创建它,否则它会在 SP1 有机会引用它之前消失。
【讨论】:
这实际上是我最终得到的。我遇到了 INSERT EXEC 语句无法嵌套的问题,因此我在 SP1 中创建了一个临时表,然后 SP2 会填充该临时表。在此之后,我将 id 列加入到 NVARCHAR 中。我会将此标记为答案,谢谢!以上是关于在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果的主要内容,如果未能解决你的问题,请参考以下文章
Informix SQL 11.5 将查询结果存储在具有动态名称的文件中