不是User-Defined Table Type insertion sometimes causing conversion error
的副本我有一个用户定义的表类型:
CREATE TYPE [dbo].[udtImport] AS TABLE(
Name varchar(256) null
Code varchar(32) null
StartDate varchar(256) null
EndDate varchar(256) null
DateCreated datetime null
在我的数据库层中,使用DateTime.Now(),
填充了DateCreated字段,而所有其他字段都来自导入的表。
当我导入填充了日期字段的文件时,出现SQL错误:
从字符转换日期和/或时间时转换失败 字符串。
使用SQL事件探查器拦截生成的代码将显示以下内容:
DECLARE @p1 dbo.udtImport;
INSERT INTO @p1
VALUES
( N'Kit A1',
N'A002',
'2016-04-02 00:00:00.000',
'2016-10-10 00:01:00.000',
'2018-10-22 16:08:28.6823468' );
exec impSaveImport @ImportList=@p1
impSaveImport是一个只有一个参数的存储过程:表类型为var,并直接插入表[Import]。没有逻辑,没有触发器,没有对其他表的引用。
在SSMS中执行此代码会显示与预期相同的错误。
将最后一个DateTime字段的最后4个数字修剪掉会导致插入查询成功。
到目前为止很好。
当我在StartDate和EndDate字段为空的情况下导入文件时,没有任何错误,并且数据已成功插入到Import表中。
当我使用探查器拦截成功插入时,我得到了:
DECLARE @p1 dbo.udtImport;
INSERT INTO @p1
VALUES
( N'Kit A1',
N'A002',
null,
null,
'2018-10-22 16:34:11.5243245' );
exec impSaveImport @ImportList=@p1
请记住,此查询已成功在表Import中插入一行。
当我在SSMS中运行此最新查询时,我得到与以前相同的转换错误,
,但是它在我的MVC应用程序中运行没有错误!
这最后一部分让我难过。
怎么可能?
项目在SQL2016中使用MVC。
答案 0 :(得分:1)
您可以使用DATETIME2
:
CREATE TYPE [dbo].[udtImport] AS TABLE(
Name varchar(256) null,
Code varchar(32) null,
StartDate varchar(256) null, -- should be datetime2 format
EndDate varchar(256) null, -- should be datetime2 format
DateCreated datetime2 null);
DECLARE @p1 dbo.udtImport;
INSERT INTO @p1(Name, Code, StartDate, EndDate, DateCreated)
VALUES
( N'Kit A1',
N'A002',
'2016-04-02 00:00:00.000',
'2016-10-10 00:01:00.000',
'2018-10-22 16:08:28.6823468' );