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
答案 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