存储过程返回NULLS

时间:2017-08-10 11:15:42

标签: sql sql-server stored-procedures ssms

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

该过程创建如下 -

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

我确定我的错误是基本的,但我很难看到它给出了什么我以前没有使用过存储过程。任何帮助都将非常感激。

3 个答案:

答案 0 :(得分:3)

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

  

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

该过程创建如下 -

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;

答案 1 :(得分:0)

您需要更改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

答案 2 :(得分:0)

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

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

将返回匹配的所有行。