首页 > 解决方案 > 在 T-SQL 存储过程的参数中将 NULL 作为值传递

问题描述

我有这个存储过程,我将一个可能为 NULL 的日期参数传递给它。我试图理解的逻辑是,当 Date 参数为 NULL 时,应选择日期列的最大值,但当参数不为 NULL 时,应将参数作为值传递。

CREATE PROCEDURE [rdm].[Param_Load_Test2] 
    @Retro_Date DATE
AS
BEGIN
    SELECT 
        CASE  
           WHEN @Retro_Date IS NULL 
              THEN MAX(lnd.FILE_DATE) 
              ELSE @Retro_Date 
        END AS TEST_DATE
    INTO 
        #LoadTest1234
    FROM 
        TWV.TABLE_WITH_VALUES AS lnd
    GROUP BY 
        FILE_DATE;

    SELECT TEST_DATE 
    FROM #LoadTest1234  
END
GO

现在,当我使用 EXEC 语句针对 NULL 情况测试上述代码时,我得到了错误的值。Not NULL 案例工作正常。

EXEC rdm.Param_Load_Test2 NULL

>> 2018-03-31
>> 2018-05-31

我只期望一个值 2018-05-31 但它返回 2 条记录。我究竟做错了什么 ?

标签: sqlsql-servertsqldatestored-procedures

解决方案


你有多余的GROUP BY。我想你想要:

        SELECT MAX(CASE WHEN @Retro_Date IS NULL THEN lnd.FILE_DATE ELSE @Retro_Date END) AS TEST_DATE
         INTO #LoadTest1234
         FROM TWV.TABLE_WITH_VALUES as lnd;

或者更简单地说:

        SELECT COALESCE(@Retro_Date, MAX(lnd.FILE_DATE)) AS TEST_DATE
        INTO #LoadTest1234
        FROM TWV.TABLE_WITH_VALUES as lnd;

我不确定您为什么要为此使用临时表。但我猜这是更复杂逻辑的一部分。


推荐阅读