错误:将返回日期从一个过程传递到下一个过程

时间:2013-08-20 18:55:02

标签: sql-server tsql

Based on this article by Pinal Dave.

错误:操作数类型冲突:日期与int

不兼容

我正在尝试构建一个涉及三个存储过程的进程(由其他进程单独调用,因此无法组合它们),第一个返回日期,然后在下一个过程中用于参数,并且该过程第三次重复(第二个过程的返回值用作第三个过程的参数)。

下面的代码显示了一个简化的类似过程,其中一个过程应返回一个日期,然后由下一个过程使用:

CREATE TABLE Pass(
    ID SMALLINT IDENTITY(1,1),
    IDDate DATE
)

INSERT INTO Pass (IDDate)
VALUES (DATEADD(DD,-1,GETDATE()))
    , (GETDATE())
    , (DATEADD(DD,1,GETDATE()))

CREATE PROCEDURE s_One
AS
BEGIN
    DECLARE @date DATE
    SET @date = DATEADD(DD,1,GETDATE())
    RETURN @date  -- generates the error
END

CREATE PROCEDURE s_Two 
@date DATE
AS
BEGIN

    SELECT *
    FROM IDDate
    WHERE [IDDate] = @date

END

DECLARE @d DATE
EXEC @d = s_One
SELECT @d
EXEC s_Two @d

根据链接的文章,理论上,返回的值应该可以用作下一个过程的参数,虽然我看到的错误是带有日期和int的操作数类型冲突:

消息206,级别16,状态2,过程s_One,第6行 操作数类型冲突:日期与int

不兼容

最终变更必要:

CREATE PROCEDURE s_One
( @date DATE OUTPUT )
AS
BEGIN
    SELECT @date = DATEADD(DD,1,GETDATE())
END

DECLARE @d DATE
EXEC s_One @d OUTPUT
SELECT @d
EXEC s_Two @d

2 个答案:

答案 0 :(得分:2)

您必须使用Output关键字在存储过程中声明一个参数,以从过程中获取返回值。

CREATE PROCEDURE s_One
@Returndate Date OUTPUT
AS
BEGIN 

另外,要将参数值保存在可在调用程序中使用的变量中,调用程序在执行该过程时必须使用OUTPUT关键字。

Exec s_One @Returndate Output

答案 1 :(得分:0)

注意:当能够更新程序时,接受的答案是正确的答案。

但是,如果您无法更新存储过程以允许OUTPUT,并且您只需要将一个过程返回的一个值传递给下一个过程(并且它不是{ {1}}),我发现在这周围的一个hack是声明一个带有一个值的变量表,然后声明一个变量,该变量成为表中的值并在下一个过程中使用它。因此,使用我在OP中提供的示例:

INT