用户定义 Table 类型插入导致转换错误
User-Defined Table Type insertion causing conversion error
不是 User-Defined Table Type insertion sometimes causing conversion error
的副本
我有一个用户定义的 table 类型:
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
DateCreated 字段使用 DateTime.Now(),
在我的数据库层中填充,而所有其他字段均来自导入的 table。
当我导入填充了日期字段的文件时,出现 SQL 错误:
Conversion failed when converting date and/or time from character
string.
使用 SQL Profiler 拦截生成的代码显示:
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 是一个只有一个参数的存储过程:table 类型的 var 并直接插入 table [Import]。没有逻辑,没有触发器,没有对其他 table 的引用。
在 SSMS 中执行此代码显示与预期相同的错误。
删除最后一个 DateTime 字段的最后 4 位数字会导致插入查询成功。
到目前为止一切顺利。
当我导入 StartDate 和 EndDate 字段为空的文件时,我没有收到任何错误,并且数据已成功插入导入 table。
当我使用探查器拦截成功的插入时,我得到了这个:
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
记住这个查询成功插入一行到 table 导入。
当我在 SSMS 中 运行 这个最新的查询时,我得到了和以前一样的转换错误,
但它 运行 在我的 MVC 应用程序中没有错误!
这最后一部分让我难住了。
怎么可能?
项目正在 SQL2016 年使用 MVC。
您可以使用 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' );
不是 User-Defined Table Type insertion sometimes causing conversion error
的副本我有一个用户定义的 table 类型:
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
DateCreated 字段使用 DateTime.Now(),
在我的数据库层中填充,而所有其他字段均来自导入的 table。
当我导入填充了日期字段的文件时,出现 SQL 错误:
Conversion failed when converting date and/or time from character string.
使用 SQL Profiler 拦截生成的代码显示:
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 是一个只有一个参数的存储过程:table 类型的 var 并直接插入 table [Import]。没有逻辑,没有触发器,没有对其他 table 的引用。
在 SSMS 中执行此代码显示与预期相同的错误。
删除最后一个 DateTime 字段的最后 4 位数字会导致插入查询成功。
到目前为止一切顺利。
当我导入 StartDate 和 EndDate 字段为空的文件时,我没有收到任何错误,并且数据已成功插入导入 table。
当我使用探查器拦截成功的插入时,我得到了这个:
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
记住这个查询成功插入一行到 table 导入。
当我在 SSMS 中 运行 这个最新的查询时,我得到了和以前一样的转换错误,
但它 运行 在我的 MVC 应用程序中没有错误!
这最后一部分让我难住了。
怎么可能?
项目正在 SQL2016 年使用 MVC。
您可以使用 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' );