首页 文章

使用动态查询在另一个存储过程中使用存储过程结果和动态查询

提问于
浏览
0

我在创建使用用户定义类型的存储过程时遇到了问题,并构建了一个在存储过程结束时执行的动态查询 . 我以前做过这个,但这次是不同的 . 我正在构建一个动态聚合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 . 是否有可能通过内联方式使用存储过程的结果,可能是通过使用一种定义存储过程仅返回特定结果集的注释形式?

我希望有些人可以帮助我,

干杯Jeroen

3 回答

  • 1

    您可能会发现让调用存储过程创建一个临时表更好,然后在嵌套调用中填充该表 . 它不必是一个可见的全局表,但你不能在SP2内创建它,否则它将在SP1有机会引用它之前消失 .

  • 0

    您可以将存储过程的结果插入临时表中,并在稍后的查询中使用该表 .

    像这样的东西:

    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
    

    您只需要小心创建具有与存储过程的结果完全相同的结构的临时表(您不能省略任何列或更改列的顺序) .

  • 1

    你确定这是你想要的:

    In your code:
    
    SET @SQLQuery = @SQLQuery = 'AND [IdOfTableX] IN (EXEC [dbo].[SP2] @param1, @param2 ...)';
    

    @sqlquery将无法正确构建 .

相关问题