SQL Server: «Сбой преобразования при преобразовании даты и времени из символьной строки». - PullRequest
2 голосов
/ 14 сентября 2009

Я пытаюсь скопировать результаты из представления в таблицу, используя:

insert into tableA 
  select * from viewB order by id;

Я получаю сообщение об ошибке -

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting datetime from character string.

TableA и ViewB имеют около 80 полей. Попытка выяснить, какой из них может иметь несоответствие типов, будет длиться вечно. Как я могу быстро определить, какая колонка вызывает ошибку?

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009

У вас неверные данные в одном из ваших полей.Проверьте каждое из полей, которые должны содержать даты, с помощью функции isdate ().

Select idfield, mydatefield from mytable where isdate(mydatefield) = 0

Вы увидите записи, содержащие недопустимые даты.Это одна из причин, почему не стоит хранить даты в виде строковых данных.

2 голосов
/ 14 сентября 2009

Это даст вам список всех столбцов в вашем TableA, имеющих тип, связанный с датой (DATE, DATETIME, DATETIME2, DATETIMEOFFSET и т. Д.):

SELECT *
FROM sys.columns
WHERE object_id = object_id('TableA')
AND system_type_id IN (40, 42, 43, 58, 61)
ORDER BY name

Вы можете запустить это для обеих таблиц и посмотреть, если вы найдете какие-либо расхождения.

Или вы можете запустить это для обеих таблиц - он выдаст вам список столбцов (имен) и их связанный тип данных:

SELECT
    c.NAME,
    t.name  
FROM sys.columns c
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id
WHERE object_id = object_id('TableA')
ORDER BY c.name

Может быть, вы увидите столбец в Таблице B, который имеет тип varchar, который сопоставляется со столбцом типа DATETIME в Таблице A, и затем найдете своего виновника таким образом.

Марк

1 голос
/ 14 сентября 2009

Они в основном поля DATETIME? Похоже, он пытается засунуть строку в DATETIME, чтобы вы могли начать с просмотра первых нескольких из них.

Не должно быть слишком долго.

0 голосов
/ 14 сентября 2009

В качестве возможности отладки вы можете выполнить запрос на выборку из представления, а затем вставить их в одну вставку в таблицу A.

Тогда будет выдано сообщение об ошибке, в котором столбец не может быть вставлен. Предполагая, что вы можете сделать это вручную. Кроме этого, есть ли способ избежать строки в качестве столбца datetime?

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