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

时间:2015-05-16 12:15:05

标签: sql-server tsql stored-procedures user-defined-functions

我在创建使用用户定义类型的存储过程时遇到了问题,并构建了一个在存储过程结束时执行的动态查询。 我以前做过这个,但这次是不同的。我正在构建一个动态聚合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 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

你确定这是你想要的吗?

In your code:

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

@sqlquery将无法正确构建。

答案 2 :(得分:0)

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