2018-07-23

كيف تبحث عن جدول او عمود او فيو فى الداتابيز SQL Server

``توجد حالات كثيرة نحتاج فيها لبحث عن جدول او عمود في قاعدة البيانات مثل
  1. نتعامل مع قاعدة بيانات لم يسبق التعامل معها و نعرف عنها القليل من المعلومات و نحاول بناء بعض التقارير عليها
  2. نعرف اسم الجدول او العمود بالتقريب و لكن لا نتذكرة تحديدا لذلك نريد البحث عنه لمعرفة الاسم بالتحديد
  3. عندنا معلومة مثل نهاية الشيفت و لا نعرف اي عمود يخزن تلك المعلومة  فنقوم بالبحث مثلا عن الاعمدة التى في اسمها مثل كلمة شفت او ما شابة حتى نصل إلى العمود الذي يخزن المعومة المطلوبه
و غالبا ما يكون ذلك لأننا نعمل على قواعد بيانات ليس لها اى شرح  او الشرح المتوفر قليل.

 يوجد فى سكويل سيرفر SQL Server  سكيما SCHEMA  خاصة تسمى Information_Schema و تحتوي على مجموعة من الفيوز. هذه  الفيوز تحتوي على معلومات عن الجداول و الأعمدة و الفيوز و القيود Constaints  و بعض التفاصيل الأخري.





و ما يخصنا هنا هو ثلاثة من الفيوز Information_Schema Views وهم
  1.  Information_Schema.Tables
  2. Information_Schema.Columns 
  3. Information_Schema.Views


  • Information_Schema.Tables

    Select * from Information_Schema.Tables 



    كما يظهر من الكويري السابق ان Information_Schema.Tables  يحتوي على بيانات جميع الجداول و الفيوز في قاعدة البيانات و يتكون من  أربعة أعمدة و هي 
    1. Table_Catalog  اسم الداتابيز التى تحتوي على الجدول
    2. Table_Schema اسم الاسكيما Schema  التى يوجد بها الجدول
    3. Table_Name  اسم الجدول 
    4. Table_Type  نوع الجدول و هوا اما Base Table  أو View و هوا ما يوضح إذا ما كان Table_Name هوا اسم جدول او اسم فيو و ذلك لأن هذا الفيو Information_Schema.Tables  يعرض بيانات كل الجداول و الفيوو الموجودة في الداتابيز وليس الجداول فقط
     
  • Information_Schema.Columns 

    Select * from Information_Schema.Columns
    يحتوي الفيو Information_Schema.Columns  على بيانات جميع الأعمدة المكونة للجداول في  قاعدة البيانات و يتكون هذا الفيو من أعمدة كثيرة سأذكر منها هنا  سبعة أعمدة فقط
    1. Table_Name اسم الجدول الذي فيه العمود
    2. Column_Name اسم العمود
    3.  Ordinal_Position رقم العمود في ترتيب الاعمدة داخل الجدول
    4.  Column_Default لو ان هناك قيمة افتراضية للعمود Default Value  فسيتم تسجيلخا هنا
    5. Is_Nullable هل العمود يسمح بادخال Null Value
    6.  Data_Type نوع البيانات المخزنة في العمود
    7. Character_Maximum_Length أقصي عدد من الحروف يمكن تخزينها في العمود لو كان العمود يحتوي على نص. 

  • Information_Schema.Views

    Select * from Information_Schema.Views

    و يحتوي الفيو Information_Schema.Views  على بيانات جميع الفيوز View  فى قاعدة البيانات و يتكون من ستة أعمدة و هي 
    1. Catalog_Name اسم الداتابيز الت تحتوي الفيو
    2. Table_Schema اسم الSchema التى تحتوي الفيو
    3.  Table_Name اسم الفيو
    4. View_Definition الكويري المستخدم لانشاء الفيو
    5. Check_Option يعرض هذا العمود إذا كان الفيو تم انشاءه ب With Check_Option ام لا
    6. Is_Updatable  يشير إذا كان هذا الفيو View  يمكن تنفيذ Insert, Update, Delete  ام لا

     

بعد استعراض هذه الفيوز يمكن الاستفادة منها في البحث عن جدول او عمود او فيو فى قاعدة البيانات

    لنفرض مثلا اننا نريد البحث عن كل الجداول التى تحتوي على بيانات الفواتير  و لا نعرف اسم الجداول بالتحديد فمثلا نبحث عن كل الجداول التى تحتوي في اسمها على كلمة Bill  مثل الكويري التالى
 Select * from Information_Schema.Tables where Table_Name like '%BILL%

    و يمكن البحث عن الأعمدة التى تحتوي على عنوان عن الطريق البحث عن كلمة مثل Address
 Select * from Information_Schema.Columns where Column_Name like '%Address%'

      أو البحث عن الأعمدة التى تحتوي على عنوان عن الطريق البحث عن كلمة مثل Address  و لكن ان توجد في جدول Customer
 Select * from Information_Schema.Columns where Column_Name like '%Address%' and Table_Name ='Customer'

و في النهاية في انتظار ارائكم و تعليقاتكم

2018-07-01

كيفية كتابة الوقت التاريخ Date Time بحيث لا يتاثر بلغة السكويل سيرفر SQL Server

عند كتابة كويري به شرط على حقل يحتوي على تاريخ  Date  او تاريخ ووقت  DateTime  مثل الكويري بالأسفل

Select Id, FirstName, HireDate  From Employee
Where
HireDate>='05-06-2018'

كيف تتوقع ان يترجم SQL Server هذا التاريخ  هل يترجمه على انه الخامس من شهر يونيو ام السادس من شهر مايو
اي هل هو يوم - شهر - سنة  ام شهر - يوم - سنة.
  هذا يتوقف على اللغة الافتراضية Default Language فى السكويل سيرفر SQL Server.

لو كانت اللغة الافتراضية Default Language فى سكويل سيرفر SQL Server هو US_English  فسيكون الفورمات الذي يستعمله سكويل سيرفر عند تحويل اى نص إلى تاريخ هو MM-DD-YYYY اي شهر- يوم - سنة اي سيفهم السكويل سيرفر التاريخ على انه السادس من شهر مايو.




اما لو كانت اللغة الافتراضية Default Language فى سكويل سيرفر SQL Server هو  British فسيكون الفورمات الذي يستعمله سكويل سيرفر عند تحويل اى نص إلى تاريخ هو DD-MM-YYYY اي يوم-شهر- سنة اي سيفهم السكويل سيرفر التاريخ على انه الخامس من شهر يونيو.


ولو كانت اللغة الافتراضية Default Language فى سكويل سيرفر SQL Server هو Arabic  فسيكون الفورمات الذي يستعمله سكويل سيرفر عند تحويل اى نص إلى تاريخ هو DD-MM-YYYY اي شهر- يوم - سنة و لكن بالتاريخ الهجري اى سيفهما لسكويل سيفر التاريخ على انه الخامس من شهر جمادي الثاني.


يمكن التغلب على هذه المشكلة باى من الطرق الاتيه

  1.  كتابة التاريخ بفورمات لا يتاثر بلغة السكويل سيرفر SQL Server 

    كتابة التاريخ و الوقت بالأيزو  ISO فورمات و هذا الفورمات لايتاثر باللغة الافتراضية Default Language  للسكويل سيرفر SQL Server. و هذا الفورمات على شكل  yyyy-mm-ddThh:mi:ss.mmm اى سنه - شهر - يوم T ساعات:دقائق:ثواني بدون أى مسافات و بذلك يفهم SQL Server التاريخ و الوقت كما هوا مكتوب و لا يحدث اخلاف بين الايام و الشهور و السنين.

  2. و يمكن ايضا عند كتابة تاريخ فقط ان يتم كتابتة على شكل YYYYMMDD بدون اى فواصل او مسافات و هنا يفهم السكويل سيرفر SQL Server النص المكتوب على انه التاريخ المظبوط بغض النظر عن اللغة الافتراضية Default Language و يعتبر الوقت الساعة 12:00 AM  و بذلك يمكن كتابة الكويري بالأعلى على الصورة التالية و ذلك ليفهم السكويل سيرفر SQL Server التاريخ على انه الخماس من شهر يونيو
    Select Id, FirstName, HireDate  From Employee
    Where
    HireDate>='20180605'
    او 
    Select Id, FirstName, HireDate  From Employee
    Where
    HireDate>='2018-06-05T00:00:00.000'
  3. ضبط فورمات التاريخ و الوقت الخاص بجلسة الاتصال Session

    يمكن اخبار السكويل سيرفر SQL Server عن الفورمات المطلوب ان يعتبره عن تحويل النصوص إلى تاريخ و وقت و ذلك عن طريق الجمله التالية
    Set dateformat dmy
    هذه الجملة تخبر سكويل سيرفر SQL Server ان يفهم النصوص على شكل التاريخ على انها مكتوبة على فورمات  DD-MM-YYYY اى يوم- شهر- سنه و لكن تاثير هذه الجملة ينتهي بمجرد قطع الاتصال مع سكويل سيرفر و يجب تنفيذها كل مرة نقوم فيها بالاتصال مره اخري
    في المثال التالي يظهر كيف تم تغيير الفورمات بعد استعمال جملة Set DateFormat dmy. 
و فى النهاية في انتظار ارائكم و تعليقاتكم

2018-06-27

الدرس 2 - تحميل SQL Server Express Edition و تجهيز بيئة العمل


  1. تحميل SQL Server Express Edition  من على موقع ميكروسوفت و هوا اصدار مجاني لا يحتاج لرخصة و يمكن التحميل من الرابط التالى
    SQL Server 2017 Expres
  2. عند عمل دونلوود سيقوم بتحميل الملف المسئول عن التثبيت البرنامج و هو SQLServer2017-SSEI-Expr.exe

2018-06-24

ما الفرق بين UNION و UNION ALL فى SQL SERVER

  1. UNION تزيل اي صفوف مكررة فى  انتيجة النهائية للكويري
  2. بينما UNION ALL تحافظ على نتيجة تنفيذ الكويري كما هي بدون إزالة لأى  صفوف متكررة
لنزي مثال على ذلك

2018-06-20

ما الفرق بين Delete From و Truncate Table


  الفرق الأساسي بين الجملتين هو ان Truncate Table TableName يتم تنفيذها اسرع بكثير جدا من Delete From   TableName و خاصة إذا كان الجدول به بيانات كثيره و يرجع ذلك لطريقة عمل كل منها كما هو موضح فيما يلي:

الموضوع المميز

تاثير استعمال Like على Performance الكويري في SQL Server

  نفترض كويري كما بالأسفل Select Id, FirstName, LastName,  JobDescription  From Employee where FristName Like '%hm%'

أكثر المواضيع زيارة