2017-08-10 232 views
0

我是新來的存儲過程,並沒有使用它們在我的項目以前。我創建了我的第一個過程,但它沒有返回預期的結果。存儲過程返回NULLS

的步驟創建如下 -

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

我敢肯定,我的錯誤是基本的,但我掙扎,看到它被賦予我以前沒有使用存儲過程是什麼。非常感激任何的幫助。

+1

標記您正在使用的dbms。該代碼是特定於產品的。 – jarlh

+1

您正在設置過程範圍內的變量,而不是調用腳本的範圍。所以您選擇的變量從未設置過。 – HoneyBadger

回答

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; 
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 
0

只是想提一下,你可以直接在存儲過程中返回數據,你不需要把它作爲輸出參數,因爲你不能在你設置的參數中保存多個值。 在您的示例中,如果數據返回多行,則只會獲取最後一條可用記錄。例如

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

這將返回所有匹配的行。