代码之家  ›  专栏  ›  技术社区  ›  callisto

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

  •  2
  • callisto  · 技术社区  · 8 年前

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

    当我导入一个填充了日期字段的文件时,我会得到一个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,并直接插入到表[导入]。没有逻辑,没有触发器,没有对其他表的引用。

    在SSMS中执行此代码将显示与预期相同的错误。
    修剪最后一个日期时间字段的最后4位数字会导致插入查询成功。

    到现在为止,一直都还不错。

    当导入的文件的startdate和enddate字段为空时,不会出现错误,并且数据已成功插入到导入表中。

    当我使用探查器截获成功的插入时,我得到了:

    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
    

    请记住,此查询已成功地在表导入中插入一行。

    当我在SSMS中运行这个最新的查询时,我得到了与以前相同的转换错误,

    但它在我的MVC应用程序中运行没有错误!

    这最后一部分使我很为难。

    怎么可能?

    项目正在使用MVC和SQL2016。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Lukasz Szozda    8 年前

    你可以用 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