用户定义的表类型插入导致转换错误

时间:2018-10-22 14:43:48

标签: sql asp.net-mvc sql-trace

不是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。

1 个答案:

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

db<>fiddle demo