2011-08-18 12 views
2

我对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 

当我尝试执行该脚本,我得到以下错误:

消息257,级别16,状态3,过程UPDATE_DATE 19行 从数据datetime类型为int隐式转换是不允许的。使用CONVERT函数来运行此查询。

它试图用我的@Status_ID参数做些什么吗?

回答

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)。

3

RETURN存储过程中的值只能是整数。因此您选择收到错误转换@Date_Valueint

它看起来像你需要一个功能,而不是一个存储过程

CREATE FUNCTION (Transact-SQL)

或者,你可以改变RETURNSELECT,但我会建议使用FUNCTION用于此类请求。

+0

什么是决定因素选择使这个功能在程序上? – ShelbyZ

+0

通常我会将存储过程看作是将更改存储在数据库中的数据的操作,或者返回整个结果集以及可选的OUTPUT参数值。而函数不影响任何数据,只是基于传递的参数和可选的数据读取返回一个值 – Curt

0

您不必使用“返回”来返回值,您可以使用“select”返回值。只需在SP末尾更改RETURN关键字并使用SELECT,我就可以工作。

0

Return关键字必须用于返回一个整数。尝试将其更改为Select @Date_Value

2

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

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