SQL从过程返回日期时间会导致隐式转换错误

时间:2011-08-18 21:51:20

标签: sql

我对SQL很新,并且正在尝试编写一个过程来检查传入的值并设置一个本地日期时间变量,然后返回该变量。

USE [MyDB]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [Common].[Update_Date] 
@Status_ID int
AS
BEGIN
SET NOCOUNT ON;

DECLARE @Date_Value DATETIME

IF @Status_ID = 2
    SET @Date_Value = GETDATE()
ELSE
    SET @Date_Value = NULL

RETURN @Date_Value
END
GO

当我尝试执行此脚本时,出现以下错误:

Msg 257,Level 16,State 3,Procedure Update_Date,第19行 不允许从数据类型datetime到int的隐式转换。使用CONVERT函数运行此查询。

是否尝试使用我的@Status_ID参数执行某些操作?

7 个答案:

答案 0 :(得分:7)

存储过程使用OUTPUT参数返回值:

CREATE PROCEDURE [Common].[Update_Date] 
@Status_ID int,
@Date_Value DATETIME OUTPUT
AS
BEGIN
SET NOCOUNT ON;

IF @Status_ID = 2
    SET @Date_Value = GETDATE()
ELSE
    SET @Date_Value = NULL
END
GO

从ADO.Net调用时,您使用ParameterDirection.Output。从T-SQL中调用OUTPUT子句:

declare @date DATETIME;
exec  [Common].[Update_Date] 2, @date OUTPUT;
SELECT @date;

一般情况下,最好不要将程序输出与返回和结果集混合(这样就可以投票反对大多数其他建议你必须使用SELECT)。使用OUTPUT使程序可以从其他T-SQL代码重用,使用结果集(SELECT)使得它更难使用,因为T-SQL在捕获调用过程的结果集时遇到问题(您必须使用INSERT ... SELECT并处理all the problems that has)。

答案 1 :(得分:3)

存储过程中的

RETURN值只能是整数。因此,您将@Date_Value转换为int

时出错

看起来你需要一个函数,而不是一个存储过程

CREATE FUNCTION (Transact-SQL)

或者,您可以将RETURN更改为SELECT,但我建议您使用FUNCTION来处理此类请求。

答案 2 :(得分:2)

存储过程的返回值必须是整数。 RETURN @Date_Value行正在抛出错误。

答案 3 :(得分:1)

我相信存储过程的返回值是一个整数,并且你的return语句将datetime转换为int。你可以选择select来返回值吗?

SELECT @Date_Value

以下是有用的返回值,输出值和结果集的链接:

http://sqlserverpedia.com/wiki/Stored_Procedures_-_Output_Parameters_%26_Return_Values

答案 4 :(得分:0)

您不必使用“return”返回值,使用“select”返回值。只需更改SP末尾的RETURN关键字,然后使用SELECT即可。

答案 5 :(得分:0)

必须使用Return关键字返回整数。尝试将其更改为选择@Date_Value

答案 6 :(得分:0)

你遇到了一些问题。试试这个:

CREATE PROCEDURE [Common].[Update_Date](
   @Status_ID INT
) AS

SET NOCOUNT ON
BEGIN 

   --will @Date_Value have an initial value of NULL????
   DECLARE @Date_Value DATETIME       

   SET @Date_Value = NULL

   IF @Status_ID = 2 BEGIN
      SET @Date_Value = GETDATE()
   END

   SELECT @Date_Value

END