从过程返回datetime的SQL将导致隐式转换错误
我对SQL是相当陌生的,并且尝试编写一个过程,该过程将检查传入的值并设置一个本地datetime变量,然后返回该变量从过程返回datetime的SQL将导致隐式转换错误,sql,Sql,我对SQL是相当陌生的,并且尝试编写一个过程,该过程将检查传入的值并设置一个本地datetime变量,然后返回该变量 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
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,16级,状态3,程序更新日期,第19行
不允许从数据类型datetime隐式转换为int。使用CONVERT函数运行此查询
它是否试图使用@Status\u ID参数执行某些操作?
返回存储过程中的值只能是整数。因此,将@Date\u值
转换为int
看起来您需要的是函数,而不是存储过程
或者,您可以将RETURN
更改为SELECT
,但我建议对这种类型的请求使用功能。您不必使用“RETURN”返回值,而是使用“SELECT”返回值。只需更改SP末尾的RETURN关键字,然后使用SELECT,我就可以工作。必须使用RETURN关键字返回整数。尝试将其更改为选择@Date\u Value存储过程的返回值必须是整数。RETURN@Date\u Value
行抛出了错误。您遇到了一些问题。试试这个:
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
我相信存储过程的返回值是一个整数,您的return语句正在将datetime转换为int。您可以改为执行select来返回值吗
SELECT @Date_Value
以下是有关返回值、输出值和结果集的链接,您可能会发现这些链接很有用:
存储过程使用输出参数返回值:
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调用时,使用。在T-SQL中,您使用输出子句调用:
declare @date DATETIME;
exec [Common].[Update_Date] 2, @date OUTPUT;
SELECT @date;
一般来说,最好不要将过程输出与返回和结果集混合使用(这样会对您使用的大多数其他建议投反对票)。使用输出使过程可以从其他T-SQL代码中重用,使用结果集(SELECT)使使用变得更加困难,因为T-SQL在捕获被调用过程的结果集时遇到问题(您必须使用INSERT…SELECT并处理).选择将其作为函数而不是过程的决定因素是什么?通常,我认为存储过程是一种操作,它将更改存储在数据库中的数据,或返回整个结果集,还可以选择输出参数值。而函数不影响任何数据,只根据传递的参数返回一个值,并且可以选择读取数据。注意调用exec[Common].[Update_Date]2,@Date OUTPUT中的输出
代码>。没有它,@date
将保持未初始化状态。只是通过艰苦的学习。