【问题标题】:Stored Procedure Returns NULLS存储过程返回 NULLS
【发布时间】:2017-08-10 11:15:41
【问题描述】:

我是存储过程的新手,以前没有在我的项目中使用过它们。我已经创建了我的第一个程序,但它没有返回预期的结果。

过程创建如下-

CREATE PROCEDURE GetRetirementDetails @DOB DATE, @Gender VARCHAR(10)
AS
DECLARE @DateRet DATE,
        @AgeRet DECIMAL(18,2)

SELECT @DateRet = [DateRet], @AgeRet = [AgeRet]
FROM [State]
WHERE [From] <= @DOB
AND [To] >= @DOB
AND (Gender = @Gender OR Gender = 'Both')

我正在使用以下语句执行该过程-

DECLARE @DateRet DATE,
        @AgeRet DECIMAL(18,2),
        @DOB DATE,
        @Gender VARCHAR(10)

SET @DOB = '1975-10-10'
SET @Gender = 'Male'

EXECUTE GetRetirementDetails @DOB, @Gender
SELECT @DateRet, @AgeRet

返回的结果为NULL,NULL

但是,当我运行以下语句时,即手动输入参数的过程,我得到了所需的结果。

SELECT [DateRet], [AgeRet]
FROM [State]
WHERE [From] <= '1975-10-10'
AND [To] >= '1975-10-10'
AND (Gender = 'Male' OR Gender = 'Both')

所需输出为 NULL,67.00

我确定我的错误是基本的,但我很难看到它给出的内容我以前没有使用过存储过程。任何帮助将不胜感激。

【问题讨论】:

  • 标记您正在使用的 dbms。该代码是特定于产品的。
  • 您在过程范围内设置变量,而不是在调用脚本的范围内。因此,您选择的变量从未设置过。

标签: sql sql-server stored-procedures ssms


【解决方案1】:

如果要从存储过程中返回值,则需要将它们声明为参数。 . .然后正确调用:

我是存储过程的新手,还没有在我的项目中使用过它们 之前。我已经创建了我的第一个程序,但它没有返回 预期的结果。

过程创建如下-

CREATE PROCEDURE GetRetirementDetails (
    @in_DOB DATE,
    @in_Gender VARCHAR(10),
    @out_DateRet DATE OUTPUT,
    @out_AgeRet DECIMAL(18, 2) OUTPUT
) AS
BEGIN
    SELECT @out_DateRet = [DateRet], @out_AgeRet = [AgeRet]
    FROM [State]
    WHERE [From] <= @in_DOB AND [To] >= @in_DOB AND
          (Gender = @in_Gender OR Gender = 'Both')
END;

然后称它为:

DECLARE @DateRet DATE,
        @AgeRet DECIMAL(18,2),
        @DOB DATE,
        @Gender VARCHAR(10);

SET @DOB = '1975-10-10';
SET @Gender = 'Male';

EXECUTE GetRetirementDetails @DOB, @Gender, @DateRet OUTPUT, @AgeRet OUTPUT;
SELECT @DateRet, @AgeRet;

【讨论】:

    【解决方案2】:

    只想提一下,您可以只在存储过程中返回数据,您不需要将其作为输出参数,因为您设置的参数中不能保存多个值。 在您的示例中,如果数据返回多行,您将仅获得最后一条可用记录。例如

    IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest
    GO
    DECLARE @dteRunDate DATETIME;
    SELECT @dteRunDate = GETDATE();
    
    CREATE TABLE #tmpTest
    (
        [FROM]      DATETIME    ,
        [TO]        DATETIME    ,
        [GENDER]    NVARCHAR(10),
        [AGERET]    INT
    )
    INSERT INTO #tmpTest
    (
        [FROM]                  ,
        [TO]                    ,
        [GENDER]                ,
        [AGERET]
    )
    SELECT @dteRunDate,@dteRunDate,'M',10 UNION ALL
    SELECT @dteRunDate,@dteRunDate,'F',NULL UNION ALL
    SELECT @dteRunDate,@dteRunDate,'BOTH',20;
    
    
    DECLARE @DateRet    DATETIME                ,
            @AgeRet     DECIMAL(18,2)           ,
            @DOB        DATETIME                ,
            @Gender     NVARCHAR(10)
    
    SELECT  @DOB = @dteRunDate;
    SELECT  @Gender = 'M';
    
    
    SELECT  @DateRet    = [FROM]        , 
            @AgeRet     = [AgeRet]
    FROM    #tmpTest
    WHERE   [From] <=   @DOB
    AND     [To]    >=  @DOB
    AND     (Gender = @Gender OR Gender = 'Both')
    
    
    SELECT  @DateRet,@AgeRet;
    

    将忽略所有匹配的行并返回最后一个。相反,我可以使用:

    IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest
    GO
    DECLARE @dteRunDate DATETIME;
    SELECT @dteRunDate = GETDATE();
    
    CREATE TABLE #tmpTest
    (
        [FROM]      DATETIME    ,
        [TO]        DATETIME    ,
        [GENDER]    NVARCHAR(10),
        [AGERET]    INT
    )
    INSERT INTO #tmpTest
    (
        [FROM]                  ,
        [TO]                    ,
        [GENDER]                ,
        [AGERET]
    )
    SELECT @dteRunDate,@dteRunDate,'M',10 UNION ALL
    SELECT @dteRunDate,@dteRunDate,'F',NULL UNION ALL
    SELECT @dteRunDate,@dteRunDate,'BOTH',20;
    
    
    DECLARE @DOB        DATETIME                ,
            @Gender     NVARCHAR(10)
    
    SELECT  @DOB = @dteRunDate;
    SELECT  @Gender = 'M';
    
    
    SELECT  [FROM]              , 
            [AgeRet]
    FROM    #tmpTest
    WHERE   [From] <=   @DOB
    AND     [To]    >=  @DOB
    AND     (Gender = @Gender OR Gender = 'Both')
    

    这将返回所有匹配的行。

    【讨论】:

      【解决方案3】:

      你需要改变你的SP,输出参数如下:

      CREATE PROCEDURE GetRetirementDetails @DOB DATE, @Gender VARCHAR(10)
      ,@DateRet DATE output,@AgeRet DECIMAL(18,2) output
      AS
      
      SELECT @DateRet = [DateRet], @AgeRet = [AgeRet]
      FROM [State]
      WHERE [From] <= @DOB
      AND [To] >= @DOB
      AND (Gender = @Gender OR Gender = 'Both')
      

      然后调用如下:

      DECLARE @DateRet DATE,
              @AgeRet DECIMAL(18,2),
              @DOB DATE,
              @Gender VARCHAR(10)
      
      SET @DOB = '1975-10-10'
      SET @Gender = 'Male'
      
      EXECUTE GetRetirementDetails @DOB, @Gender,@DateRet,@AgeRet
      SELECT @DateRet, @AgeRet
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-25
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 2011-12-19
        相关资源
        最近更新 更多