2

基于 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
4

2 回答 2

2

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

CREATE PROCEDURE s_One
@Returndate Date OUTPUT
AS
BEGIN 

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

Exec s_One @Returndate Output
于 2013-08-20T19:02:29.700 回答
0

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

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

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

CREATE PROCEDURE s_Two 
@date DATE
AS
BEGIN

    SELECT *
    FROM IDDate
    WHERE [IDDate] = @date

END

-- Pass a returned variable from one procedure to the next (if no OUTPUT in first procedure is allowed).
DECLARE @d TABLE(
     ID TINYINT DEFAULT 1,
     DDate DATE
)

INSERT INTO @d (DDate)
EXEC s_One

DECLARE @dt DATE
SELECT @dt = DDate FROM @d WHERE ID = 1

EXEC s_Two @dt
于 2013-08-22T16:11:39.327 回答