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

She*_*byZ 2 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
    SET @Date_Value = GETDATE()
ELSE
    SET @Date_Value = NULL

RETURN @Date_Value
END
GO
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rem*_*anu 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
Run Code Online (Sandbox Code Playgroud)

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

declare @date DATETIME;
exec  [Common].[Update_Date] 2, @date OUTPUT;
SELECT @date;
Run Code Online (Sandbox Code Playgroud)

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