ما هي حالات الاستخدام لاختيار CHAR عبر VARCHAR في SQL؟

StackOverflow https://stackoverflow.com/questions/59667

  •  09-06-2019
  •  | 
  •  

سؤال

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

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

المحلول

اختيار عموما شار إذا كانت جميع الصفوف قريبة من نفس طول.يختار فارتشار عندما يختلف الطول بشكل كبير.قد يكون CHAR أيضًا أسرع قليلاً لأن جميع الصفوف لها نفس الطول.

ويختلف ذلك حسب تطبيق قاعدة البيانات، ولكن بشكل عام يستخدم VARCHAR بايتًا واحدًا أو اثنين من بايت التخزين (للطول أو الإنهاء) بالإضافة إلى البيانات الفعلية.لذا (بافتراض أنك تستخدم مجموعة أحرف مكونة من بايت واحد) قم بتخزين الكلمة "FooBar"

  • CHAR(6) = 6 بايت (بدون حمل)
  • VARCHAR(10) = 8 بايت (2 بايت من الحمل)
  • CHAR(10) = 10 بايت (4 بايت من الحمل)

خلاصة القول هو شار يمكن ان يكون أسرع و اكثر كفاءة في استخدام المساحة للبيانات ذات الطول نفسه نسبيًا (ضمن اختلاف طول حرفين).

ملحوظة:يحتوي Microsoft SQL على 2 بايت من الحمل لـ VARCHAR.قد يختلف هذا من قاعدة بيانات إلى قاعدة بيانات، ولكن بشكل عام هناك بايت واحد على الأقل من الحمل اللازم للإشارة إلى الطول أو موسوعة الحياة على VARCHAR.

كما أشار Gaven في التعليقات، إذا كنت تستخدم مجموعة أحرف متعددة البايت ومتغيرة الطول مثل UTF8، فإن CHAR يخزن الحد الأقصى لعدد البايتات اللازمة لتخزين عدد الأحرف.لذا، إذا كان UTF8 يحتاج إلى 3 بايتات على الأكثر لتخزين حرف ما، فسيتم إصلاح CHAR(6) عند 18 بايت، حتى لو تم تخزين الأحرف اللاتينية 1 فقط.لذلك في هذه الحالة يصبح VARCHAR خيارًا أفضل بكثير.

نصائح أخرى

إذا كنت تعمل معي وتعمل مع Oracle، فمن المحتمل أن أستفيد منك varchar في كل الظروف تقريبًا.الافتراض بأن char يستخدم قوة معالجة أقل من varchar قد يكون هذا صحيحًا...في الوقت الحالي...ولكن محركات قواعد البيانات تتحسن بمرور الوقت وهذا النوع من القواعد العامة يشكل "أسطورة" مستقبلية.

شيء آخر:لم أر قط مشكلة في الأداء لأن شخصًا ما قرر الاستمرار varchar.ستستفيد بشكل أفضل من وقتك في كتابة تعليمات برمجية جيدة (استدعاءات أقل لقاعدة البيانات) وSQL فعالة (كيف تعمل الفهارس، وكيف يتخذ المحسن القرارات، ولماذا؟ exists اسرع من in عادة...).

الفكر النهائي:لقد رأيت كل أنواع المشاكل مع استخدام CHAR, أو الأشخاص الذين يبحثون عن '' عندما يجب عليهم البحث عن ' '، أو الأشخاص الذين يبحثون عن 'FOO' عندما يجب عليهم البحث عن 'FOO (مجموعة من المسافات هنا)'، أو الأشخاص الذين لا يقومون بقص الفراغات الزائدة، أو الأخطاء في Powerbuilder إضافة ما يصل إلى 2000 فراغ إلى القيمة التي ترجعها من إجراء أوراكل.

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

Char أسرع قليلاً، لذلك إذا كان لديك عمود تعرف أنه سيكون بطول معين، فاستخدم char.على سبيل المثال، تخزين (M)ale/(F)emale/(U)nالمعروف بالجنس، أو حرفين لولاية أمريكية.

هل أداء Nchar أو Char أفضل من بدائل var الخاصة بهما؟

سؤال عظيم.الجواب البسيط هو نعم في مواقف معينة.دعونا نرى ما إذا كان يمكن تفسير ذلك.

من الواضح أننا نعلم جميعًا أنه إذا قمت بإنشاء جدول بعمود من varchar(255) (دعنا نسمي هذا العمود myColumn) وأدخلت مليون صف ولكن وضعت بضعة أحرف فقط في myColumn لكل صف، فسيكون الجدول أصغر بكثير (بشكل عام) عدد صفحات البيانات التي يحتاجها محرك التخزين) مما لو قمت بإنشاء myColumn كـ char(255).في أي وقت أقوم بإجراء عملية (DML) على هذا الجدول وأطلب الكثير من الصفوف، سيكون الأمر أسرع عندما يكون myColumn varchar لأنني لست مضطرًا إلى ذلك يتحرك حول كل تلك المساحات "الإضافية" في النهاية.نقل، كما هو الحال عندما يقوم SQL Server بإجراء عمليات فرز داخلية، كما هو الحال أثناء عملية مميزة أو موحدة، أو إذا اختار الدمج أثناء خطة الاستعلام الخاصة به، وما إلى ذلك.قد يعني النقل أيضًا الوقت الذي يستغرقه نقل البيانات من الخادم إلى جهاز الكمبيوتر المحلي الخاص بي أو إلى كمبيوتر آخر أو في أي مكان سيتم استهلاكها فيه.

ولكن هناك بعض النفقات العامة في استخدام varchar.يجب على SQL Server استخدام مؤشر ثنائي البايت (الحمل)، في كل صف، لمعرفة عدد البايتات الموجودة في myColumn الخاص بهذا الصف المعين.ليست الـ 2 بايت الإضافية هي التي تمثل المشكلة، بل هي الحاجة إلى "فك تشفير" طول البيانات الموجودة في myColumn في كل صف.

في تجربتي، من المنطقي استخدام char بدلاً من varchar في الأعمدة التي سيتم ضمها في الاستعلامات.على سبيل المثال المفتاح الأساسي للجدول، أو بعض الأعمدة الأخرى التي سيتم فهرستها.CustomerNumber على جدول ديموغرافي، أو CodeID على جدول فك التشفير، أو ربما OrderNumber على جدول الطلب.باستخدام char، يمكن لمحرك الاستعلام إجراء الصلة بسرعة أكبر لأنه يمكنه إجراء حساب المؤشر المستقيم (حتميًا) بدلاً من الاضطرار إلى تحريك مؤشراته بمقدار متغير من البايتات أثناء قراءته للصفحات.أعلم أنني ربما فقدتك في تلك الجملة الأخيرة.تعتمد Coins in SQL Server على فكرة "المتنبئين". المسند هو حالة.على سبيل المثال، myColumn = 1، أو OrderNumber < 500.

لذا، إذا كان SQL Server يقوم بتنفيذ عبارة DML، وكانت المسندات أو "المفاتيح" التي يتم ربطها ذات طول ثابت (حرف)، فلن يتعين على محرك الاستعلام القيام بنفس القدر من العمل لمطابقة الصفوف من جدول واحد إلى الصفوف منه طاولة أخرى.لن يتعين عليك معرفة مدة وجود البيانات في الصف ثم السير عبر السلسلة للعثور على النهاية.كل ذلك يستغرق وقتا.

الآن ضع في اعتبارك أن هذا يمكن أن يتم تنفيذه بشكل سيئ بسهولة.لقد رأيت حرفًا يستخدم لحقول المفاتيح الأساسية في الأنظمة عبر الإنترنت.يجب أن يظل العرض صغيرًا أي.شار (15) أو شيء معقول.وهو يعمل بشكل أفضل في الأنظمة عبر الإنترنت لأنك عادةً ما تقوم فقط باسترداد أو تغيير عدد قليل من الصفوف، لذا فإن الاضطرار إلى "تقطيع" تلك المسافات الزائدة التي ستحصل عليها في مجموعة النتائج يعد مهمة تافهة بدلاً من الاضطرار إلى الانضمام إلى الملايين من الصفوف من جدول واحد إلى ملايين الصفوف في جدول آخر.

سبب آخر يجعل CHAR منطقيًا على varchar على الأنظمة عبر الإنترنت هو أنه يقلل من انقسامات الصفحات.باستخدام char، أنت في الأساس "تحتفظ" (وتضيع) تلك المساحة، لذا إذا جاء مستخدم لاحقًا ووضع المزيد من البيانات في هذا العمود، فقد خصص SQL بالفعل مساحة له وسيدخل فيها.

سبب آخر لاستخدام CHAR مشابه للسبب الثاني.إذا قام مبرمج أو مستخدم بإجراء تحديث "دُفعي" لملايين الصفوف، وإضافة بعض الجمل إلى حقل ملاحظة على سبيل المثال، فلن تتلقى مكالمة من DBA الخاص بك في منتصف الليل تتساءل عن سبب امتلاء محركات الأقراص الخاصة به.وبعبارة أخرى، فإنه يؤدي إلى نمو أكثر قابلية للتنبؤ لحجم قاعدة البيانات.

هذه هي الطرق الثلاث التي يمكن لنظام (OLTP) عبر الإنترنت الاستفادة من char عبر varchar.نادرًا ما أستخدم char في سيناريو المستودع/التحليل/OLAP لأنه عادةً ما يكون لديك الكثير من البيانات التي يمكن أن تضيفها كل أعمدة char إلى الكثير من المساحة الضائعة.

ضع في اعتبارك أن char يمكن أن يجعل قاعدة البيانات الخاصة بك أكبر بكثير ولكن معظم أدوات النسخ الاحتياطي تحتوي على ضغط البيانات، لذا فإن النسخ الاحتياطية الخاصة بك تميل إلى أن تكون بنفس الحجم تقريبًا كما لو كنت قد استخدمت varchar.على سبيل المثال LiteSpeed ​​أو RedGate SQL Backup.

هناك استخدام آخر في طرق العرض التي تم إنشاؤها لتصدير البيانات إلى ملف ذو عرض ثابت.لنفترض أنه يتعين علي تصدير بعض البيانات إلى ملف ثابت ليقرأه الكمبيوتر المركزي.إنه عرض ثابت (غير محدد).أرغب في تخزين البيانات في جدول "التدريجي" الخاص بي كـ varchar (وبالتالي استهلاك مساحة أقل في قاعدة البيانات الخاصة بي) ثم استخدام طريقة عرض لـ CAST كل شيء إلى ما يعادله من char، مع الطول المطابق لعرض العرض الثابت لهذا العمود .على سبيل المثال:

create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )

insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)

create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))

SELECT * from vwStagingTable

يعد هذا أمرًا رائعًا لأن بياناتي داخليًا تشغل مساحة أقل لأنها تستخدم varchar.ولكن عندما أستخدم DTS أو SSIS أو حتى مجرد القص واللصق من SSMS إلى Notepad، يمكنني استخدام العرض والحصول على العدد الصحيح من المسافات الزائدة.في DTS اعتدنا أن تكون لدينا ميزة تسمى، اللعنة، لقد نسيت أنني أعتقد أنها كانت تسمى "أعمدة الاقتراح" أو شيء من هذا القبيل.في SSIS، لا يمكنك فعل ذلك بعد الآن، يجب عليك تحديد مدير اتصال الملفات الثابت بشكل مضجر.ولكن بما أن لديك إعداد العرض الخاص بك، يمكن لـ SSIS معرفة عرض كل عمود ويمكنه توفير الكثير من الوقت عند إنشاء مهام تدفق البيانات الخاصة بك.

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

امل ان يساعد.جيف

هناك فوائد للأداء، ولكن هنا واحدة لم يتم ذكرها:هجرة الصف.باستخدام char، يمكنك حجز المساحة بأكملها مقدمًا. لذلك لنفترض أن لديك char (1000)، وقمت بتخزين 10 أحرف، وسوف تستخدم كل 1000 حرفًا من المساحة.في varchar2(1000)، ستستخدم 10 أحرف فقط.المشكلة تأتي عند تعديل البيانات.لنفترض أنك قمت بتحديث العمود ليحتوي الآن على 900 حرف.من الممكن أن المساحة المخصصة لتوسيع varchar غير متوفرة في الكتلة الحالية.في هذه الحالة، يجب على محرك قاعدة البيانات ترحيل الصف إلى كتلة أخرى، ووضع مؤشر في الكتلة الأصلية إلى الصف الجديد في الكتلة الجديدة.لقراءة هذه البيانات، سيتعين على محرك قاعدة البيانات الآن قراءة كتلتين.
لا أحد يستطيع أن يقول بشكل لا لبس فيه أن varchar أو char أفضل.هناك مساحة للمقايضة الزمنية، والنظر في ما إذا كان سيتم تحديث البيانات، خاصة إذا كانت هناك فرصة جيدة لنموها.

هناك فرق بين تحسين الأداء المبكر واستخدام قاعدة أفضل الممارسات.إذا كنت تقوم بإنشاء جداول جديدة حيث سيكون لديك دائمًا حقل ذو طول ثابت، فمن المنطقي استخدام CHAR، يجب أن تستخدمه في هذه الحالة.وهذا ليس تحسينًا مبكرًا، ولكنه بالأحرى تطبيق لقاعدة عامة (أو أفضل ممارسة).

أي.- إذا كان لديك حقل حالة مكون من حرفين، فاستخدم CHAR(2).إذا كان لديك حقل بأسماء الحالات الفعلية، فاستخدم VARCHAR.

سأختار varchar ما لم يخزن العمود قيمة ثابتة مثل رمز الولاية الأمريكية - والذي يتكون دائمًا من حرفين ولا تتغير قائمة رموز الولايات الأمريكية الصالحة كثيرًا :).

في كل الحالات الأخرى، حتى مثل تخزين كلمة المرور المجزأة (ذات الطول الثابت)، سأختار varchar.

لماذا - يتم دائمًا استيفاء عمود نوع char بمسافات، مما يؤدي إلى إنشاء عمود my_column تم تعريفه على أنه char(5) بقيمة "ABC" داخل المقارنة:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

خطأ شنيع.

هذا ميزة يمكن أن يؤدي إلى العديد من الأخطاء المزعجة أثناء التطوير ويجعل الاختبار أكثر صعوبة.

يشغل CHAR مساحة تخزين أقل من VARCHAR إذا كانت جميع قيم البيانات في هذا الحقل بنفس الطول.الآن ربما في عام 2009، ربما تكون قاعدة البيانات بسعة 800 جيجابايت هي نفسها بالنسبة لجميع المقاصد والأغراض مثل 810 جيجابايت إذا قمت بتحويل VARCHARs إلى CHARs، ولكن بالنسبة للسلاسل القصيرة (1 أو 2 حرف)، لا تزال CHAR "أفضل ممارسة" في الصناعة على ما أعتقد.

الآن، إذا نظرت إلى مجموعة واسعة من أنواع البيانات التي توفرها معظم قواعد البيانات حتى للأعداد الصحيحة وحدها (bit، tiny، int، bigint)، هناك أسباب لاختيار واحد على الآخر.إن مجرد اختيار bigint في كل مرة هو في الواقع جاهل قليلاً بأغراض المجال واستخداماته.إذا كان الحقل يمثل ببساطة عمر الشخص بالسنوات، فإن الرقم الكبير يعتبر مبالغة.الآن ليس بالضرورة "خطأ"، لكنه ليس فعالاً.

لكنها حجة مثيرة للاهتمام، ومع تحسن قواعد البيانات بمرور الوقت، يمكن القول أن CHAR مقابل VARCHAR تصبح أقل أهمية.

أنا أقف إلى جانب تعليق جيم ماكيث.

كما أن الفهرسة وعمليات الفحص الكاملة للجدول تكون أسرع إذا كان الجدول الخاص بك يحتوي على أعمدة CHAR فقط.بشكل أساسي، سيتمكن المحسن من التنبؤ بحجم كل سجل إذا كان يحتوي فقط على أعمدة CHAR، بينما يحتاج إلى التحقق من قيمة الحجم لكل عمود VARCHAR.

علاوة على ذلك، إذا قمت بتحديث عمود VARCHAR إلى حجم أكبر من محتواه السابق، فقد تجبر قاعدة البيانات على إعادة بناء فهارسها (لأنك أجبرت قاعدة البيانات على نقل السجل فعليًا على القرص).بينما مع أعمدة CHAR لن يحدث هذا أبدًا.

لكن ربما لن تهتم بأداء الأداء إلا إذا كانت طاولتك ضخمة.

تذكر كلمات جيكسترا الحكيمة.تحسين الأداء المبكر هو أصل كل الشرور.

أشار العديد من الأشخاص إلى أنه إذا كنت تعرف الطول الدقيق للقيمة، فإن استخدام CHAR له بعض الفوائد.ولكن في حين أن تخزين الولايات الأمريكية كـ CHAR(2) يعد أمرًا رائعًا اليوم، فعندما تتلقى رسالة من المبيعات مفادها "لقد قمنا للتو بأول عملية بيع لنا في أستراليا"، فأنت في عالم من الألم.أقوم دائمًا بالمبالغة في تقدير المدة التي أعتقد أن الحقول ستحتاج إليها بدلاً من إجراء تخمين "دقيق" لتغطية الأحداث المستقبلية.سوف يمنحني VARCHAR المزيد من المرونة في هذا المجال.

هناك بعض تكاليف المعالجة الصغيرة في حساب الحجم الفعلي المطلوب لقيمة العمود وتخصيص المساحة لـ Varchar، لذلك إذا كنت متأكدًا من المدة التي ستظل فيها القيمة دائمًا، فمن الأفضل استخدام Char وتجنب الضربة.

إنها المساحة الكلاسيكية مقابل مقايضة الأداء.

في MS SQL 2005، يكون طول متغير Varchar (أو NVarchar للغات التي تتطلب بايتين لكل حرف، أي الصينية).إذا أضفت إلى الصف بعد كتابته على القرص الثابت، فسوف يحدد موقع البيانات في موقع غير مجاور للصف الأصلي ويؤدي إلى تجزئة ملفات البيانات الخاصة بك.وهذا سوف يؤثر على الأداء.

لذا، إذا لم تكن المساحة مشكلة، فإن Char أفضل للأداء ولكن إذا كنت تريد الاحتفاظ بحجم قاعدة البيانات منخفضًا، فإن varchars أفضل.

أعتقد أنه في حالتك ربما لا يوجد سبب لعدم اختيار Varchar.إنه يمنحك المرونة، وكما ذكر عدد من المستجيبين، فإن الأداء الآن هو أنه باستثناء ظروف محددة للغاية، فإننا نحن البشر العاديون (على عكس Google DBA) لن نلاحظ الفرق.

الشيء المثير للاهتمام الجدير بالملاحظة عندما يتعلق الأمر بأنواع DB هو أن sqlite (قاعدة بيانات صغيرة شائعة ذات أداء مثير للإعجاب) تضع كل شيء في قاعدة البيانات كسلسلة وأنواع سريعة.

أستخدم دائمًا VarChar وعادةً ما أجعله أكبر بكثير مما قد أحتاج إليه بشدة.على سبيل المثال.50 للاسم الأول، كما تقول لماذا لا تكون آمنًا فقط.

التجزئة.يحتفظ Char بالمساحة بينما لا يحتفظ VarChar بذلك.قد يكون من الضروري تقسيم الصفحة لاستيعاب التحديث إلى varchar.

لن أستخدم الأحرف أبدًا.لقد أجريت هذا النقاش مع العديد من الأشخاص وكانوا دائمًا يطرحون العبارة المبتذلة التي تقول إن شار أسرع.حسنا أقول، كم أسرع؟ما الذي نتحدث عنه هنا، المللي ثانية، الثواني، وإذا كان الأمر كذلك كم؟هل تخبرني أن شخصًا ما يدعي أن الأمر أسرع ببضعة ميلي ثانية، فهل يجب علينا إدخال الكثير من الأخطاء التي يصعب إصلاحها في النظام؟

إذن إليك بعض المشكلات التي ستواجهها:

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

لنفترض الآن أن لديك المثال المثالي لحقل char المكون من حرف واحد فقط ولكن الحقل اختياري.إذا قام شخص ما بتمرير سلسلة فارغة إلى هذا الحقل، فستصبح مسافة واحدة.لذلك عندما يستعلم عنها تطبيق/عملية أخرى، فإنها تحصل على مسافة واحدة، إذا لم تستخدم rtrim.لدينا مستندات وملفات وبرامج أخرى بتنسيق XML، ونعرض مساحة واحدة فقط في الحقول الاختيارية ونفصل الأشياء.

لذا عليك الآن التأكد من أنك تقوم بتمرير القيم الخالية وليس سلسلة فارغة إلى حقل char.ولكن هذا ليس الاستخدام الصحيح للصفر.هنا هو استخدام فارغة.لنفترض أنك حصلت على ملف من البائع

الاسم|الجنس|المدينة

بوب || لوس أنجلوس

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

الاسم|المدينة

بوب | سياتل

حسنًا، نظرًا لعدم تضمين الجنس، سأستخدم القيمة null.يدعم Varchars هذا دون مشاكل.

شار من ناحية أخرى مختلف.عليك دائمًا إرسال null.إذا قمت بإرسال سلسلة فارغة، فسوف ينتهي بك الأمر بحقل يحتوي على مسافات فيه.

يمكنني الاستمرار في التعامل مع جميع الأخطاء التي كان علي إصلاحها من الأحرف وفي حوالي 20 عامًا من التطوير.

عند استخدام VARCHAR VALUES ، يحتاج SQL Server إلى 2 بايت إضافي لكل صف لتخزين بعض المعلومات حول هذا العمود ، بينما إذا كنت تستخدم char ، فهذا لا يحتاج إلى ذلك إلا إذا كنت

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

ولهذا السبب، ليس لديك أي توفير في المساحة باستخدام VARCHAR(200) مقارنةً بـ CHAR(200)

يؤدي استخدام CHAR (NCHAR) وVARCHAR (NVARCHAR) إلى إحداث اختلافات في طرق تخزين خادم قاعدة البيانات للبيانات.يقدم الأول الفراغات الزائدة؛لقد واجهت مشكلة عند استخدامه مع عامل التشغيل LIKE في وظائف SQL SERVER.لذلك لا بد لي من جعله آمنًا باستخدام VARCHAR (NVARCHAR) في جميع الأوقات.

على سبيل المثال، إذا كان لدينا طاولة اختبار (المعرف INT، الحالة CHAR(1)), ، وتكتب دالة لسرد كافة السجلات ذات قيمة معينة مثل ما يلي:

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

في هذه الدالة نتوقع أنه عندما نضع المعلمة الافتراضية فإن الدالة ستعيد جميع الصفوف، لكنها في الواقع لا تفعل ذلك.سيؤدي تغيير نوع البياناتStatus إلى VARCHAR إلى حل المشكلة.

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