У нас есть код, который запустил ошибку за последний день. Код не менялся в течение нескольких месяцев. Сообщение об ошибке:Ошибка обрыва SQL без причины
Msg 8152, уровень 16, состояние 2
Строка или двоичные данные будут усечены.
SQL-утверждение:
UPDATE TUP
SET insured_state_cd = UTCA.state_province_cd
FROM #TEMP_UAFR_POLICY TUP
JOIN dbo.UVW_THIRDS UT ON
TUP.prim_owner_third_id = UT.third_id
JOIN dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA ON
UT.primary_address_id = UTCA.address_id
JOIN dbo.UVW_INTERNATIONAL_COUNTRY UIC ON
UTCA.country_cd = UIC.country_cd
Теперь, я расскажу вам, что да, в столбце UTCA.state_province_cd больше, чем колонны insured_state_cd. Мы знаем, что это не очень хорошо, но для нашего процесса тестирования потребуется минимум месяц, чтобы получить одобрение изменений и в производство. Нам действительно нужно выяснить причину этой проблемы.
Мы проверили таблицу UTCA, и никакая запись не имеет длину более 2, которая является размером столбца таблицы TUP. Так как это тип CHAR, мы также проверили двоичные значения таблицы, чтобы убедиться, что это не возврат каретки или какой-либо другой скрытый символ.
Чтобы добавить к тайне, этот код работает:
UPDATE TUP
SET insured_state_cd = UTCA.state_province_cd
FROM #TEMP_UAFR_POLICY TUP
JOIN dbo.UVW_THIRDS UT ON
TUP.prim_owner_third_id = UT.third_id
JOIN dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA ON
UT.primary_address_id = UTCA.address_id
JOIN dbo.UVW_INTERNATIONAL_COUNTRY UIC ON
UTCA.country_cd = UIC.country_cd
WHERE UTCA.state_province_cd IN
(SELECT DISTINCT UTCA2.state_province_cd
FROM dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA2)
Как вы можете видеть, второй код такой же, как первый, это в основном только чеками делает 1 = 1? Кроме того, код работает на нашем сервере разработки, как есть, в оригинальной форме. Мы буквально поддерживали db, восстанавливали Dev, запускали код, и он работает.
Если вам нужны только первые два символа из UTCA.state_province_cd, как насчет 'SET insured_state_cd = LEFT (UTCA.state_province_cd, 2) ...'? И есть ли dev и производственные БД, работающие с * точной * той же версией SQL Server? –
Вот идея * сумасшедшая * - почему бы не создать таблицу #temp, чтобы ее столбцы и типы данных действительно соответствовали исходным таблицам? Я не могу понять, почему увеличение длины определения таблицы #temp может потребоваться в любое время для утверждения и развертывания.Если это занимает месяц, тогда у вас больше проблем, связанных с усечением строк. –
Также вы проверили значения, полученные в результате объединения, или *** все значения *** в таблице? SQL Server может оптимизировать вещи в разных заказах, где длина проверяется * до * фильтра на одном сервере, а длина проверяется * после * фильтра на другом. –