存储过程返回NULLS
问题描述:
我是新来的存储过程,并没有使用它们在我的项目以前。我创建了我的第一个过程,但它没有返回预期的结果。存储过程返回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
我敢肯定,我的错误是基本的,但我挣扎,看到它被赋予我以前没有使用存储过程是什么。非常感激任何的帮助。
答
如果要从存储过程返回值,则需要将它们声明为参数。 。 。然后调用正确:
我是新来的存储过程,并没有在我的项目 以前使用它们。我已经创建了我的第一个程序,但它并没有返回预期结果 。
的步骤创建如下 -
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;
答
你需要改变你的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
答
只是想提一下,你可以直接在存储过程中返回数据,你不需要把它作为输出参数,因为你不能在你设置的参数中保存多个值。 在您的示例中,如果数据返回多行,则只会获取最后一条可用记录。例如
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')
这将返回所有匹配的行。
标记您正在使用的dbms。该代码是特定于产品的。 – jarlh
您正在设置过程范围内的变量,而不是调用脚本的范围。所以您选择的变量从未设置过。 – HoneyBadger