Пользовательская вставка табличного типа, вызывающая ошибку преобразования - PullRequest
0 голосов
/ 22 октября 2018

Не является дубликатом Вставка пользовательского типа таблицы, иногда вызывающая ошибку преобразования

У меня есть определенный пользователем тип таблицы:

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 показывает ту же ошибку, что и ожидалось.
Обрезка последних 4 цифр последнего поля DateTime приводит к успешному выполнению запроса вставки.

Пока все хорошо.

Когда я импортирую файл с пустыми полями 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 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...