سؤال

لدي قاعدة بيانات SQL Server 2000 مع عمود من النوع Varchar (255). جميع البيانات هي إما فارغة ، أو بيانات رقمية بنقطتين من الدقة (على سبيل المثال '11 .85 '). حاولت تشغيل استعلام T-SQL التالي ، لكنني تلقيت خطأ "خطأ تحويل نوع البيانات Varchar إلى Numeric"

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

جربت فريقًا أكثر تحديداً ، والذي فشل أيضًا.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

لقد حاولت أيضًا ما يلي لمعرفة ما إذا كانت أي بيانات غير رقمية ، وكانت القيم الوحيدة التي تم إرجاعها فارغة.

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

حاولت التحويل إلى أنواع البيانات الأخرى ، مثل التعويم والمال ، لكن المال فقط كان ناجحًا. لذلك جربت ما يلي:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... التي عملت بشكل جيد. أي أفكار لماذا فشل الاستعلام الأصلي؟ هل ستكون هناك مشكلة إذا قمت أولاً بالتحول إلى المال ثم إلى العشرية؟

شكرًا!

هل كانت مفيدة؟

المحلول

من المحتمل أن هذا يعتمد على ما إذا كان الرمز العشري عبارة عن فاصلة أو نقطة. فيما يلي بعض استفسارات الاختبار ونتائجها:

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

الوثائق ل isnumeric يقول:

إرجاع isnumeric 1 عندما يتم تقييم تعبير الإدخال إلى عدد صحيح صالح أو رقم نقطة عائم أو أموال أو نوع عشري ؛ وإلا فإنه يعود 0

كلاهما 3.6 و 3,6 يمكن أن يلقي money, ، لهذا السبب isnumeric('3,6') عائدات 1.

لحل هذه المشكلة ، استبدل الفاصلة بنقاط (أو العكس ، إذا كان نظامك يستخدم الفاصلة كرمز عشري):

select cast(replace('3,6',',','.') as decimal)

خيار آخر هو تغيير "الرمز العشري" في النوافذ. إنه في لوحة التكوين -> الإقليمية واللغة -> التنسيقات -> إعدادات إضافية -> أرقام.

نصائح أخرى

سبب آخر هو سلاسل فارغة. على سبيل المثال ، إذا كنت تستخدم معالج الاستيراد لاستيراد ملف CSV ، فستصبح الحقول الفارغة سلاسل فارغة ، وليس خالية.

هذا تعبير شائع لإصلاح هذا:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

حدد الممثل (isnull (mycolumn ، 0) على أنه عشري (4،2)) من [mytable] ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top