用户定义 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' );

db<>fiddle demo