این خطا به دلیل تلاش برای تبدیل یک مقدار varchar به نوع smallint (cp.id) رخ میدهد که مقدار انتخابی از نوع varchar بیشتر از محدوده نوع smallint (INT1) است. برای حل این مشکل میتوانید به چندین راه اقدام کنید:
تغییر نوع cp.id به یک نوع بزرگتر:
اگر مقادیر موجود در cp.id بیشتر از محدوده smallint بودند، میتوانید نوع داده آن را به یک نوع بزرگتر مثل int یا bigint تغییر دهید.
ALTER TABLE dbo.TablesLog
ALTER COLUMN id INT; -- یا bigint
البته باید مطمئن شوید که مقادیر موجود در cp.id از محدوده نوع جدید پشتیبانی میکنند.
استفاده از TRY_CAST یا TRY_CONVERT:
اگر نمیخواهید نوع داده cp.id را تغییر دهید، میتوانید از توابع TRY_CAST یا TRY_CONVERT برای تبدیل امن مقدار varchar به نوع smallint استفاده کنید. این توابع در صورت ناموفقیت تبدیل، NULL برگردانده میشوند.
SELECT *, cp.id, cp.name
FROM dbo.TablesLog tl
INNER JOIN Receipted r ON tl.RecordID = r.id
LEFT JOIN Central100.central.def.provinces cp ON cp.id = TRY_CAST(left(right(r.Barcode, 18), 3) AS SMALLINT)
این کد با استفاده از TRY_CAST تلاش میکند مقدار varchar را به smallint تبدیل کند و در صورت موفقیت نتیجه را برگرداند، در غیر این صورت NULL برگردانده میشود.
اطمینان از مطابقت نوعها:
مطمئن شوید که مقداری که از barcode برای تبدیل به cp.id استفاده میشود، به درستی مطابق با نوع smallint است. اگر مقادیر از نوع صحیح (integer) نیستند، ممکن است با مشکل مواجه شوید.
بررسی دادههای ورودی:
اگر مقادیر درون barcode نادرست و ناپایدار هستند، باید از منطقیتر کردن دادههای ورودی اطمینان حاصل کنید تا تبدیل به smallint مشکلساز نشود. به هر حال، انتخاب بهترین راه حل بستگی به شرایط و نیازهای شما دارد، و باید با دقت و دقت به موارد فوق نگاه کنید.
نوشته شده توسط
ly.comeng
سلام دوستان من کد زیر رو نوشتم
SELECT *,cp.id,cp.name
FROM dbo.TablesLog tl
inner JOIN Receipted r on tl.RecordID=r.id
left join Central100.central.def.provinces cp on cp.id=left(right(R.Barcode,18),3)
منتها این خطا رو میده
The conversion of the varchar value '611' overflowed an INT1 column. Use a larger integer column.
نوع cp.id = smallint و نوع barcode =decimal هست
وقتی cast میکنم خروجی سلکت Id و name
Null میشن