SQL Server / دليل حلول تحريري
إصلاح فشل تحويل التواريخ وأنواع المعلمات
حدد حد التحويل الفعلي واحفظ Unicode وأصلح عقود الأنواع دون قبول بيانات عمل غير صالحة صامتاً.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد تتضمن الرسائل Conversion failed when converting date and/or time from character string. أو Error converting data type nvarchar to numeric. احتفظ بالنص الفعلي والرقم في التشخيص.
قد يختلف السلوك حسب اللغة أو تنسيق التاريخ، أو يفشل مع فاصلة عشرية أو تاريخ ملتبس أو قيمة تتجاوز مدى النوع.
افهم الأسباب المحتملة
- يؤوّل نص كقيمة محددة النوع عند معلمة مشغل أو تعبير أو مقارنة أو إسناد أو عمود وجهة. تتبع التحويلات الضمنية أسبقية الأنواع وقد تقع بعيداً عن الأعمدة المعروضة.
- فقد Unicode وفشل التحويل مشكلتان مرتبطتان بعقد الإدخال لكنهما ليستا العرض نفسه. قد يتلف غياب N أو نوع معلمة غير Unicode النص قبل وصوله إلى nvarchar.
تتبع الأنواع عبر الحد كاملاً
سجّل صيغة المصدر ونوع معلمة المشغل وطولها وتوقيع الإجراء والمتغيرات الوسيطة ونوع العمود ودقته ومنازله. استخدم إعادة مصطنعة بدلاً من نشر بيانات شخصية أو مالية. لا يفيد عمود أوسع نصاً اقتطع في متغير وسيط. افحص تحذيرات التحويل وأنواع التعبيرات إن بدا الخطأ غير مرتبط بالعمود المعروض.
حدد النص غير الصالح دون تعديل
تعيد TRY_CONVERT القيمة NULL عند فشل تحويل مدعوم، مما يتيح فحص نص بصيغة معروفة للقراءة فقط. وقد تخطئ لتحويل ممنوع صراحة. يستخدم المثال النمط 112 لتاريخ متفق عليه بثمانية أرقام وdecimal لعقد عدد بسيط. يميز النص غير الصالح من القيمة الصحيحة؛ ويجب تمييز مصدر NULL من مصدر تالف في الاستيراد الفعلي.
SELECT RawDate,TRY_CONVERT(date,RawDate,112) AS parsed_date,
RawAmount,TRY_CONVERT(decimal(10,2),RawAmount) AS parsed_amount
FROM (VALUES (N'20260131',N'19.95'),
(N'20260230',N'not-a-number'))v(RawDate,RawAmount);
RawDate parsed_date RawAmount parsed_amount
20260131 2026-01-31 19.95 19.95
20260230 NULL not-a-number NULL
الثلاثون من فبراير غير صالح؛ ولا يتحول العدد الفاشل إلى صفر صامتاً. لا يضمن ترتيب العرض دون ORDER BY.
أصلح عقد الإدخال من المصدر
فضّل معلمة تاريخ للتاريخ ومعلمة decimal بحجم صريح للمبلغ. إن استوردت نصاً فاتفق على صيغة ثابتة ونمط تحويل صريح واعزل الصفوف المرفوضة مع الأسباب. لا تغير لغة الخادم كله من أجل ملف واحد، ولا تحول الفشل إلى صفر أو تاريخ رمزي إلا بسياسة عمل صريحة.
احفظ Unicode في كل مرحلة
استخدم معلمات وأعمدة nvarchar لعقد الدورة متعدد اللغات وثوابت N في T-SQL. يقيس n أزواج UTF-16، فتحتاج المحارف الإضافية اختبار الحدود بعناية. يعد varchar بترتيب UTF-8 في SQL Server 2019 بديلاً صريحاً لا خاصية لكل varchar. اربط القيم ولا تدمجها في SQL ديناميكي؛ وتمنع المعلمات تحول الاقتباس إلى صياغة أمر.
تحقق من نجاح الإصلاح
اختبر التواريخ الصحيحة والكبيسة وغير الصالحة وNULL وحدود decimal والأسماء العربية والاقتباس والطول الأقصى عبر مسار ربط التطبيق الفعلي. أكد رفض غير الصالح بوضوح وعودة الصحيح دون تغير وعدم تحويل الأعمدة المفهرسة بلا حاجة.
امنع تكرار المشكلة
- تتبّع تواقيع الأنواع مع الواجهة والمخطط، ووثّق صيغ الاستيراد والوقت والمنازل وأطوال Unicode. اختبر اختلاف الثقافات عند الحد واحتفظ بدليل الرفض دون نشر البيانات الأصلية الحساسة.