2

不是用户定义的表类型插入的重复,有时会导致转换错误

我有一个用户定义的表类型:

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(),,而所有其他字段都来自导入的表。

当我导入填充了日期字段的文件时,出现 SQL 错误:

从字符串转换日期和/或时间时转换失败。

使用 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 是一个存储过程,它只有一个参数:表类型 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。

4

1 回答 1

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' );

db<>小提琴演示

于 2018-10-22T14:47:18.943 回答