【问题标题】:Query saved in table to run in different query's where clause查询保存在表中以在不同的查询 where 子句中运行
【发布时间】:2019-11-07 16:22:49
【问题描述】:

我有一个表格,其中包含“报告”或“通讯信”(html 文件)列表。此列表将出现在网站的下拉列表中。其中一些项目需要“检查”以查看是否允许将它们添加到下拉列表中。

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

在此表中有一个列“Cor_PolNeedCheck_ToShow”。此值链接到存储该文件查询的不同表。

从这里我需要创建一个查询来构建将要显示的实际列表。但为了做到这一点,我需要运行第二个表中的查询来执行检查。为此,我创建了以下查询并返回了预期的结果:

    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 只是为了显示它需要做什么)。此查询位于存储过程中,@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 子句中调用存储过程。然后我想到了一个用户定义的函数,但问题是你不能在函数中调用存储的过程(“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;

结束

在我的脚本中运行上述函数给我一个错误“只能在函数内执行函数和一些扩展存储过程。”:

    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))

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    如果可能,最好将存储过程转换为函数。然后就可以在 WHERE 子句中使用函数了。

    如果您不能将其转换为函数,那么最好执行 SP 并将完整结果存储在变量中。现在你可以在 WHERE 子句中使用这张表了。

    【讨论】:

    • 感谢您的推荐,我已经用函数的代码编辑了上面的代码(得到一个错误“只有函数和一些扩展存储过程可以从函数内执行。”
    【解决方案2】:

    您应该将存储过程的结果存储在一个变量中,然后在下一个语句的条件中使用它。您可以使用 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)
    

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2018-03-11
      • 2022-01-09
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多