Я получаю эту ошибку и знаю, что это из-за поля LAST_NAME.
Сообщение 8152, уровень 16, состояние 14, строка 4
Строка или двоичные данные будут усечены.
Оператор завершен.
Вот SQL
INSERT INTO Rpt_Authority_Exceeds_Guidelines
(
Last_Name --DECLARE to be CHAR(20)
, First_Name
, Band_Level
, emp_status
, Exp_Description
, Amount
, CSG
, Above_CSG
, Below_CSG
, AOR1_Desc
, AOR2_Desc
, AOR3_Desc
, AOR4_Desc
, Updated_By
, Update_Date
)
SELECT
soa_ees.Last_Name --DECLARE to be Varchar(50)
, soa_ees.First_Name
, soa_ees.job_gradf AS Band_Level
, soa_ees.emp_status
, soa_amounts.[description] AS Exp_Description
, soa_eeamounts.Amount
, soa_defaults.Amount AS CSG
, 0 AS Above_CSG
, 0 AS Below_CSG
, soa_ees.AOR1_Desc
, soa_ees.AOR2_Desc
, soa_ees.AOR3_Desc
, soa_ees.AOR4_Desc
, soa_eeamounts.[uid] AS Updated_By
, soa_eeamounts.lastchange AS Update_Date
FROM
soa_eeamounts
INNER JOIN soa_ees
ON soa_eeamounts.EmployeeId = soa_ees.emp_id
INNER JOIN soa_defaults
ON soa_eeamounts.code = soa_defaults.code
AND soa_ees.job_gradf = soa_defaults.job_grade
INNER JOIN soa_amounts
ON soa_eeamounts.code = soa_amounts.code
WHERE
soa_eeamounts.amount > soa_defaults.amount
OR (soa_eeamounts.code = 'EXT' AND soa_eeamounts.amount > 5000000)
Меня удивляет то, что длина самого длинного LAST_NAME, удовлетворяющего условию WHERE, составляет всего 16Однако, если я удалю предложение WHERE, будут значения LAST_NAME, длина которых будет превышать длину столбца Target, который определен как CHAR (20).
Я видел ситуации с SQL, в которых выражение WHERE применяется ПОСЛЕ некоторой функции, которая действительно нуждалась в фильтре сначала, но я никогда не ожидал этого.Похоже, что SQL Server вставляет запись в целевую таблицу ДО того, как предложение WHERE будет применено с целью последующего удаления тех, которые не соответствуют критериям фильтра, но возникает ошибка усечения на INSERT до того, как предложение WHERE может быть применено для удаления.записи, которые были временно вставлены.
Полагаю, я доказал это, подтвердив, что, если в конце добавить подсказку запроса
OPTION (MAXDOP 1)
для запуска на одном процессоре, это работает, но я не могу поверить своим глазам.
Я пришел к правильному выводу или что-то еще происходит?