我对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参数执行某些操作?
答案 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