#sql-server
#sql-сервер #sql-server
Вопрос:
Я получаю эту ошибку:
Сообщение 245, Уровень 16, Состояние 1, строка 10
Ошибка преобразования при преобразовании значения nvarchar ‘PLANT001’ в тип данных int
Я попытался добавить convert и cast как int к первой строке, которая выдает ошибку, а также к последнему соединению, но я все равно получаю ошибку.
SELECT
hh.PlantID AS 'Plant ID',
hh.ERP AS 'ERP',
hh.ShipViaID AS 'Ship Via ID',
cc.carrier AS 'Carrier',
cc.service AS 'Service',
cc.packagetype AS 'Pkg Type',
hd.HandlingChargeTypeID AS 'Handling Charge ID',
hd.HandlingCharge 'Handling Charge',
hr.AdditionalPercentageAdded 'Heading Addl % Added',
hd.ApplyToEachPackage AS 'Apply to Each Pkg',
hr.MinimumHandlingCharge AS 'Min Handling Charge',
hr.MaximumHandlingCharge AS 'Max Handling Charge'
FROM
HandlingChargeHeader hh
JOIN
HandlingChargeDetails hd ON hd.HandlingChargeHeaderID = hh.ID
JOIN
HandlingChargeRequirements hr ON hh.ID = hr.HandlingChargeHeaderID
LEFT JOIN
xcarrier_codes cc ON cc.ID = hh.ShipViaID AND hh.PlantID = cc.plantid
cc.plantid
= nvarchar
, hh.plantid
= int
Комментарии:
1. Правильный ответ — изменить тип данных столбца, но вы можете использовать
TRY_CAST()
вместоCAST()
2. » cc.plantid = nvarchar, hh.plantid = int » Вот ваша проблема. Почему вы храните внешний ключ (который явно таковым не является, поскольку вы не смогли бы сделать это с соответствующим ограничением) как
int
в одной таблице, так иnvarchar
в другой? Исправьте тип данных, а затем добавьте свои ограничения внешнего ключа.3. ‘PLANT001’ — это значение varchar, которое для приведения выдаст ошибку, как вы можете объединить их с другим типом данных? вы можете удалить символы перед выполнением любого преобразования или приведения.
Ответ №1:
Вы можете использовать try_convert()
:
select . . .
from . . .
on . . and
try_convert(int, cc.plantid) = cc.plantid;
Однако, похоже, это не решает вашу проблему, вам нужно конвертировать это все время, когда требуются данные.
Рекомендуемое решение — изменить вашу модель данных, если это возможно, с немедленным вступлением в силу.
Комментарии:
1. Получено сообщение о том, что ‘try_convert’ не является распознанным именем встроенной функции.
2. Учитывая, что значение
'Plant001'
это никогда не будет преобразовано вint
. @AndreaI. вы, конечно, не все еще используете SQL Server 2008 (или более раннюю версию)? Все они полностью (или почти) не поддерживаются. Вам действительно следует посмотреть на путь обновления в ближайшее время, еслиTRY_CONVERT
не распознан.