SQL Ошибка сервера - конверсия переполнена int - PullRequest
0 голосов
/ 30 апреля 2020

Я получаю следующую ошибку для простого оператора INSERT INTO

The conversion of the nvarchar value '5551662080' overflowed an int column.

Я понимаю, что значение превышает границы INT, но я нигде не преобразую в INT. Поле в исходной таблице - это NVARCHAR (MAX) в месте назначения, которое я пробовал. FLOAT и BIGINT не работают с одной и той же ошибкой.

Справочная информация - исходная таблица, которую я не могу контролировать - все поля NVARCHAR (MAX) и таблица содержат данные о более чем 6 миллионах файлов, созданных в результате выполнения сценариев powershell. Я перемещаю их в таблицу с более подходящими типами данных.

Вот SQL:

INSERT INTO dbo.File01 (
[Name]
,[Length]
,[Directory]
,[Extension]
,[CreationTime]
,[LastWriteTime]
,[IsFile]
)
SELECT 
    [Name]
    ,cast([Length] as Bigint)
    ,[Directory]
    ,[Extension]
    ,convert(datetime2,[CreationTime], 103)
    ,convert(datetime2,[LastWriteTime], 103)
    ,iif(isnull([Length],1)=1, 0, 1)
FROM dbo.FileData

Проблема в столбце длины файла - в противном случае все работает нормально. Он работает с первыми 91k строками, просто терпит неудачу, когда достигает этого большого числа.

Все ссылки, которые я могу найти, указывают на триггеры или хранимые процедуры, где где-то скрыто преобразование INT, но здесь это не так - это совершенно новая БД, которая существует только для этой работы

* ПРАВКА Структура таблицы для целевой таблицы

Column Name Data type   Max Length  precision   scale   is_nullable 
Name        nvarchar    -1     0           0       0         0
Length      bigint       8    19           0       1         0
Directory   nvarchar    -1     0           0       1         0
Extension   nvarchar    -1     0           0       1         0
CreationTime    datetime2   8 27           7       1         0
LastWriteTime   datetime2   8 27           7       1         0
IsFile      bit         1      1           0       1         0

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы должны попробовать это, просто используйте одинарную кавычку, как показано ниже.

iif(isnull([Length], '1') = '1', '0', '1')

ИЛИ

iif(isnull(Cast([Length] as Bigint), 1) = 1, 0, 1)

Live db <> fiddle demo.

0 голосов
/ 30 апреля 2020

Казалось бы, столбец length в file01 является целым числом , а не bigint . Таким образом, преобразование столбца в bigint не помогает.

Вы можете решить проблему, используя try_convert() или try_cast() - для соответствующего типа:

try_cast([Length] as int)

Однако я рекомендую исправить тип данных, потому что file01 не может представлять данные, которые вы хотите вставить в него:

alter table file01 alter column length bigint;

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

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