البرمجة

استخراج رقم الطلب (SO#) في SQL Server 2012 بدون استخدام UDF

في SQL Server 2012، يمكنك استخدام تعبيرات النمط (Pattern Matching) باستخدام الدالة PATINDEX و SUBSTRING لاستخراج رقم الطلب (SO#) من السلسلة المحددة. لنقدم حلاً لهذا السيناريو، يمكننا كتابة استعلام يعتمد على PATINDEX و SUBSTRING لتحقيق هذه الوظيفة.

قبل البدء في الاستعلام، دعنا نفهم كيف يمكننا استخدام هذه الدوال. PATINDEX تعيد الموقع الأول لنمط محدد داخل سلسلة النص، و SUBSTRING تقوم بقص جزء من السلسلة بناءً على الموقع والطول.

الآن، دعنا نقوم بكتابة الاستعلام الذي يلبي متطلباتك:

sql
DECLARE @InputString NVARCHAR(MAX) = 'this is the SO#12345 55' DECLARE @Pattern NVARCHAR(50) = '%SO[# ]%[0-9]%' DECLARE @StartPosition INT = PATINDEX(@Pattern, @InputString) IF @StartPosition > 0 BEGIN DECLARE @EndPosition INT = PATINDEX('%[^0-9]%', SUBSTRING(@InputString, @StartPosition, LEN(@InputString))) IF @EndPosition > 0 BEGIN DECLARE @Result NVARCHAR(MAX) = SUBSTRING(@InputString, @StartPosition + 2, @EndPosition - 2) SELECT @Result AS ExtractedSONumber END END

يعتمد هذا الاستعلام على الفرضية أن “SO#” هو النمط الذي نحاول استخراج الرقم منه. يتم استخدام PATINDEX للبحث عن موقع بداية “SO#” في النص، ثم يتم استخدام SUBSTRING لقص جزء من النص بناءً على الموقع والطول. يتم بعد ذلك استخدام PATINDEX مرة أخرى للعثور على الموقع الأول الذي لا يحتوي على أرقام، ويتم استخدام SUBSTRING مرة أخرى لقص الجزء المطلوب.

يرجى تغيير قيمة المتغير @InputString في الاستعلام بالنص الذي ترغب في استخراج رقم الطلب منه. يمكنك تكرار هذا الاستعلام لبقية الأمثلة التي ذكرتها في سؤالك.

يرجى مراعاة أن هذا الحلا لا يعتمد على استخدام وظيفة يمكنك إنشاءها (UDF)، كما طلبت.

المزيد من المعلومات

في محاولة لتوسيع مفهوم الاستعلام وتوفير مزيد من التفاصيل، يُمكننا التعمق في بعض الجوانب التقنية واللغوية المتعلقة بالاستعلام المقترح.

تعتمد الاستعلام على استخدام تعبيرات النمط (PATINDEX) للبحث عن نمط يحتوي على “SO#” تليها أحرف أو أرقام وربما فراغات. يتم ذلك باستخدام النمط '%SO[# ]%[0-9]%' حيث % تعني أي مجموعة من الأحرف، و [# ] تعني إما “#” أو فراغ.

عند العثور على موقع بداية “SO#” باستخدام PATINDEX، يتم استخدام SUBSTRING لقص جزء من النص بدءًا من هذا الموقع. يتم التحقق ثم من الموقع الأول الذي لا يحتوي على رقم باستخدام PATINDEX('%[^0-9]%', SUBSTRING(@InputString, @StartPosition, LEN(@InputString))). يتم قص الجزء الناتج باستخدام SUBSTRING مرة أخرى للحصول على الجزء الذي يحتوي على الرقم الطلب.

هذا الاستعلام يُظهر كيف يمكن تحقيق الغرض المطلوب دون الحاجة إلى استخدام دالة تعريف المستخدم (UDF). يمكنك تكرار هذا النمط لمثل هذه السلاسل الأخرى وضبط النمط حسب الحاجة.

يرجى مراعاة أن تحسين الأداء والكفاءة يمكن تحقيقهما من خلال تحسين الاستعلام وتحسين فهمك لأساسيات لغة الاستعلام SQL.

زر الذهاب إلى الأعلى