Попытка установить значение столбца, не поддерживающего NULL, в NULL

У меня возникла странная проблема в базе данных клиентов при использовании функции ISNULL() SQL Server 2014. Поиск в Интернете привел меня к тому, что другие люди столкнулись с той же ошибкой, но при INSERTing. Я получаю следующую ошибку при запуске простого SELECT:

Msg 681, Level 16, State 3, Line 1
Attempting to set a non-NULL-able column's value to NULL.

Следующий запрос выдает эту ошибку:

SELECT
    ISNULL( [t2].[date_update], GETDATE() )
FROM
    [dbo].[t1]
INNER JOIN
    [dbo].[t2] ON [t1].[a] = [t2].[id];

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

CREATE TABLE [dbo].[t1] (
    [id]          INT           NOT NULL PRIMARY KEY,
    [a]           NVARCHAR(100) NOT NULL
);

CREATE TABLE [dbo].[t2] (
    [id]          BIGINT        NOT NULL PRIMARY KEY,
    [date_update] DATETIME      NULL
);

Любая помощь или понимание очень ценятся!

Редактировать:

При устранении неполадок мне удалось воспроизвести то же сообщение об ошибке в клиентской системе со следующим INSERT:

CREATE TABLE #t2 ([id] BIGINT NOT NULL PRIMARY KEY NONCLUSTERED, [date_update] DATETIME NULL);

INSERT INTO #t2 ([id], [date_update)
SELECT [id], [date_update]
FROM [dbo].[t2];

Редактировать2:

Дальнейшее устранение неполадок показало, что индекс, который использует SELECT, неисправен. При попытке восстановить индекс я получаю ту же ошибку!

Rebuild failed for Index xxx
Attempting to set a non-NULL-able column's value to NULL.

person Chris Pickford    schedule 28.10.2015    source источник
comment
Вы присоединяете столбец BIGINT к столбцу NVARCHAR(100)?   -  person James    schedule 28.10.2015
comment
Единственное, что я вижу, это то, что вы сравниваете текстовое поле с целочисленным типом. Возможно, сообщение об ошибке просто неправильное. Вы уверены, что каждый экземпляр [a] можно преобразовать в BIGINT? SELECT [a] FROM [dbo].[t1], ГДЕ TRY_PARSE([a] AS BIGINT) IS NULL   -  person Martin Soles    schedule 28.10.2015
comment
Да, я тоже так думал, но проблема не в этом. Все значения в столбце NVARCHAR могут быть неявно преобразованы в BIGINT.   -  person Chris Pickford    schedule 28.10.2015
comment
Используя ваши урезанные таблицы, какие данные вы можете поместить в эти таблицы, чтобы эта ошибка воспроизводилась? Я подозреваю, что ошибка вызвана какой-то частью кода, который вы удалили.   -  person Tab Alleman    schedule 28.10.2015
comment
Я пытался воспроизвести ошибку локально на своем ноутбуке, но не могу этого сделать, учитывая любую комбинацию данных. Я подозреваю, что это проблема окружающей среды.   -  person Chris Pickford    schedule 28.10.2015
comment
Я только что смог воспроизвести ошибку на клиентском сервере альтернативным методом - я обновлю вопрос.   -  person Chris Pickford    schedule 28.10.2015
comment
Это может быть связано с окружающей средой, если вы выполняете вставку или обновление в любой части кода, который вы удалили, но SELECT никогда не может пытаться установить значение столбца в любой среде, о которой я знаю.   -  person Tab Alleman    schedule 28.10.2015
comment
проверьте ответ здесь: stackoverflow.com/questions/26955418/   -  person Tab Alleman    schedule 28.10.2015
comment
@ lad2025 - В вопросе четко указано SELECT.   -  person Chris Pickford    schedule 28.10.2015
comment
@TabAlleman - Спасибо, но он работает с SQL 2014 (12.0.2000.8) - если предположить, что все исправления 2012 года были включены в 2014 год.   -  person Chris Pickford    schedule 28.10.2015
comment
@ChrisPickford Подготовьте sqlfiddle.com Я не могу воссоздать ваш случай   -  person Lukasz Szozda    schedule 28.10.2015
comment
Я не вижу здесь ошибки программирования. Если это проблема окружающей среды, вы, скорее всего, получите помощь на dba.stackexchange.com.   -  person Tab Alleman    schedule 28.10.2015
comment
Повторяется ли ошибка при использовании COALESCE() вместо ISNULL()?   -  person BeaglesEnd    schedule 28.10.2015
comment
@TabAlleman Я думаю, вы правы, см. edit2 выше, я думаю, что в одном или нескольких индексах может быть повреждение.   -  person Chris Pickford    schedule 28.10.2015
comment
Можете ли вы удалить и заново создать индекс?   -  person Tab Alleman    schedule 28.10.2015
comment
@TabAlleman К сожалению, поврежден кластерный индекс, каким-то образом существует строка, содержащая только NULL, в том числе в столбцах NOT NULL. Я подозреваю, что это могло быть вызвано ошибкой диска или, возможно, повреждением резервного транспорта. Я буду уведомлять клиента о повреждении базы данных и медленно отступать :)   -  person Chris Pickford    schedule 28.10.2015


Ответы (2)


Сообщение об ошибке отображалось из-за существования полностью пустой строки в таблице, содержащей NOT NULL определения столбца.

Причина повреждения в этом случае неизвестна, но ошибка может быть объяснена тем, что запрос SELECT создает хеш-таблицу для облегчения соединения, пытаясь вставить NULL в столбец первичного ключа.

Это можно проверить, создав таблицу с тем же определением, но со всеми столбцами NULLable, вставив в нее из поврежденной таблицы, а затем запросив NULLs в предполагаемых NOT NULL столбцах.

person Chris Pickford    schedule 28.10.2015

иногда, когда я звоню select * from sys.dm_exec_query_stats, я получаю эту ошибку, и я понятия не имею, как ее поймать. TRY CATCH не улавливает эту ошибку.

person Germo Görtz    schedule 30.12.2020
comment
Добро пожаловать в Stack Overflow. Это не отвечает на вопрос. Попробуйте открыть новый вопрос, если у вас возникнут проблемы. Чтобы улучшить свои ответы, прочитайте тур и Как написать хороший ответ?. - person ChristianB; 30.12.2020