首页 > 解决方案 > 如何运行将数据作为 nvarchar 传递的过程?

问题描述

我无法执行该程序。将 varchar 数据类型转换为日期时间时出现错误错误。

如果我在没有过程的情况下编写,它将作为 nvarchar 插入

如何测试我的程序通过日期?

Financial.spInsertValidity 36168, '2021-10-14 14:43:07.530', '2021-10-20 14:43:07.530', 147, 1, 0, 'thiagocorrea@pedidoeletronico.com'

Create Procedure Financial.spInsertValidity(

    @idEmpresa bigint
,   @dtInicioVigencia datetime
,   @dtFimVigencia datetime
,   @idProduto int 
,   @qtdProduto int
,   @stPeriodoTolerancia bit
,   @User nvarchar(256)

)

As
Begin

Declare @Id bigint
Declare @ActiveUser nvarchar(5);
Declare @IdUser bigint;

Set @ActiveUser = Administrative.fnCheckActiveUser(@User);
Set @IdUser = Administrative.fnGetIdUser(@User)

if(@ActiveUser = 'false')
throw 51000, 'User not registered', 1;

Insert tb_vigencia_empresa(

    IdEmpresa
,   dtInicioVigencia
,   dtFimVigencia
,   stAtivo
,   idProduto
,   qtdProduto
,   stPeriodoTolerancia
,   CreatedBy
,   ChangedBy
,   CreationDate
,   ChangeDate
)
 Values(

    @IdEmpresa
,   @dtInicioVigencia
,   @dtFimVigencia
,   1
,   @idProduto
,   @qtdProduto
,   @stPeriodoTolerancia
,   @IdUser
,   @IdUser
,   SWITCHOFFSET (GetDate(), administrative.ReturnTimeZone(@User))
,   SWITCHOFFSET (GetDate(), administrative.ReturnTimeZone(@User))
)

Set @Id = @@Identity
Select @Id as Id

End

在此处输入图像描述

标签: sqlsql-server

解决方案


看起来你已经set dateformat dmy;生效了,例如:

set dateformat dmy;
exec spInsertValidity 36168, '2021-10-14 14:43:07.530', '2021-10-20 14:43:07.530', 147, 1, 0, 'thiagocorrea@pedidoeletronico.com';

Msg 8114 Level 16 State 5 Line 0
Error converting data type varchar to datetime.

尝试使用mdyorymd代替,例如:

set dateformat mdy;
exec spInsertValidity 36168, '2021-10-14 14:43:07.530', '2021-10-20 14:43:07.530', 147, 1, 0, 'thiagocorrea@pedidoeletronico.com';
-- No error

set dateformat ymd;
exec spInsertValidity 36168, '2021-10-14 14:43:07.530', '2021-10-20 14:43:07.530', 147, 1, 0, 'thiagocorrea@pedidoeletronico.com';
-- No error

避免 DATEFORMAT 问题

为避免DATEFORMAT设置问题,请考虑将datetime类型标量变量传递到您的存储过程中,并用于CONVERT填充它们,例如:

set dateformat dmy;
declare @param1 datetime = convert(datetime, '2021-10-14 14:43:07.530', 121);
declare @param2 datetime = convert(datetime, '2021-10-20 14:43:07.530', 121);
exec spInsertValidity 36168, @param1, @param2, 147, 1, 0, 'thiagocorrea@pedidoeletronico.com';
-- No error

有关受支持的日期时间样式数字及其格式,请参阅CAST 和 CONVERT (Transact-SQL)文档。


推荐阅读