查询保存在表中以在不同查询的where子句中运行

时间:2019-11-07 06:15:10

标签: sql sql-server tsql

我有一个表,其中包含“报告”或“信函”(html文件)的列表。此列表将显示在网站的下拉列表中。其中某些项目需要进行“检查”,以查看是否允许将其添加到下拉菜单中。

此表的示例(我删除了不需要显示的列): MainTable

此表中有一列“ Cor_PolNeedCheck_ToShow”。此值链接到另一个表,该文件存储在该表中。 enter image description here

在这里,我需要创建一个查询,该查询将构建将要显示的实际列表。但是,为此,我需要运行第二个表中的查询以执行检查。我创建了以下查询来执行此操作,它带回了预期的结果:

    DECLARE @retvalue  INT
    DECLARE @Paramater NVARCHAR(20) = '241215'
    DECLARE @Cor_GroupCde NVARCHAR(10) = 248

    DECLARE @Statement NVARCHAR(500);

    SELECT @Statement = (SELECT Lookup_Query + @Paramater FROM [dbo].[Ref_Lookup] 
                WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow  FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = @Cor_GroupCde));

    EXEC @retvalue = sp_executesql @Statement;
    PRINT @retvalue

此值需要再次传递到查询中,以验证要显示还是不显示每个记录。这是将显示项目的查询(我在查询中添加了上面的@retvalue只是为了显示其需要执行的操作)。此查询在存储的proc中,在其中,@ Paramater将从应用程序传递(在上方),然后根据需要在下文中使用(因为上面的查询需要适合该查询)。

    SELECT Cor_Group_Cde, Cor_Desc
    FROM Ref_Correspondence
    WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
    AND (Cor_PolNeedCheck_ToShow IS NULL OR --@retValue > 0)

我面临的问题是我需要将@retValue放入where子句。 我虽然有一个存储过程,但是不能在where子句中调用存储过程。然后,尽管我使用的是用户定义的函数,但是存在的问题是,您无法在函数中调用存储的proc(“ sp_executesql”)。

由于公司标准,我也无法在应用程序中执行此操作。有什么办法可以解决这个问题,或者有什么办法可以避免上述问题?

--------------------编辑---------------------

我创建的函数如下:

    USE [DBName]
    GO
    /****** Object:  UserDefinedFunction [dbo].[ufn_CorrespondenceCheckResult]    Script Date: 4/11/2019 5:35:04 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[ufn_CorrespondenceCheckResult] 
    (
      @Paramater nvarchar(20),
      @Cor_GroupCde nvarchar(10)
    )
   RETURNS int
   AS
   BEGIN

DECLARE @Statement nvarchar(MAX);
DECLARE @Return int;

set @Return = 0;

SELECT @Statement = (SELECT Lookup_Query + @Paramater FROM [dbo].[Ref_Lookup] 
                WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow  FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = @Cor_GroupCde));

EXEC @Return = sp_executesql @Statement;

return @Return;

END

在我的脚本中运行上面的函数会给我一个错误:“ 仅函数和某些扩展的存储过程可以在函数中执行。 ”:

    SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR ((SELECT [dbo].[ufn_CorrespondenceCheckResult] (@Paramater,@Cor_GroupCde)) > 0))

2 个答案:

答案 0 :(得分:1)

如果可能的话,将存储过程转换为函数会更好。然后,您可以在WHERE子句中使用函数。

如果无法将其转换为函数,则最好执行SP并将完整结果存储在变量中。现在,您可以在WHERE子句中使用此表。

答案 1 :(得分:0)

您应该将存储过程的结果存储在一个变量中,然后在下一条语句的条件下使用该结果。您可以使用OUTPUT参数从存储过程中返回值。

DECLARE @count INT

EXEC FindProductByModel  --CREATE a stored procedure FindProductByModel  instead of a function
@Paramater = '241215',
@Cor_GroupCde = '248',
@retvalue= @count OUTPUT  --@retval is an output paramater of your stored procedure

SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR @count>0)