Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从过程返回datetime的SQL将导致隐式转换错误_Sql - Fatal编程技术网

从过程返回datetime的SQL将导致隐式转换错误

从过程返回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

我对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
    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
将保持未初始化状态。只是通过艰苦的学习。