Исправить ошибку — ошибка преобразования при преобразовании значения nvarchar в тип даты int в SQL

#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 не распознан.