الجمعة، 4 يناير 2019

Microsoft SQL Server Services

قبل الانتقال إلى الدرس التالي اود ان أعطي نبذة مختصرة عن Microsoft SQL Server Services او ما يطلق عليه بلغة العربية خدمات  مايكروسوفت SQL SERVER . ان نظام أدارة قواعد البيانات من مايكروسوفت يوفر العديد من الخدمات Services في هذه المدونة ركزنا في المواضيع الاولى على الخدمة الأساسية وهي خدمة قواعد البيانات database services.  هناك خدمات أخرى يوفرها هذا النظام ومنها خدمات تكامل البيانات أو SQL Server Integrated Services او ما يطلق عليه اختصارا ب SSIS هذه الخدمة معنية بشكل أساسي بمفهوم تكامل البيانات. تكامل البيانات موضوع واسع ولكن سوف أحاول شرحه بشكل مبسط. لنفرض مثلا انه لدينا برنامجين او تطبيقين مختلفين ونود أن نجعل هاذين البرنامجين يتحدثان مع بعضهما ؟ البرامج لا تمتلك قابلية التحدث مثل البشر ولكن تمتلك قابلية التكامل Integration لكي تتواصل مع بعضها البعض وهناك عده طرق للتكامل مثلا عن طريق استخدام خدمات الويب web services او عن طريق ما يسمى file integration تكامل الملفات حيث يقوم التطبيق الأول بتضمين البيانات التي يريد إرسالها إلى التطبيق الثاني في ملف من نوع csv او excel ثم يقوم البرنامج الثاني بقراءة هذا الملف و يعالج البيانات وخزنها ضمن قاعدة بياناته. نوع آخر من طرق للتكامل هو تكامل قواعد البيانات أو database integration حيث يقوم التطبيق الأول بتخزين البيانات التي يريد أن يشاركها مع التطبيق الثاني ضمن جدول محدد في قاعدة البيانات ومن ثم يقوم التطبيق الثاني بقراءة البيانات من هذا الجدول ونسخها وتخزينها ضمن قاعدة البيانات الخاصة به بغرض معالجتها. الأمثلة السابقة شرحت مبداء تكامل البيانات بشكل عام. نظام إدارة قواعد البيانات من مايكروسوفت هو تطبيق حاله كحال التطبيقات الأخرى وكما وضحنا ان التطبيقات تملك ميزة التكامل Integration والخدمة المختصة بوظيفة تكامل البيانات في هذا التطبيق اسمها  SQL Server Integrated Services او تعرف اختصارا ب SSIS. 
توفر خدمات SSIS مجموعة واسعة من الخيارات من أجل تكامل البيانات مع نظام إدارة قواعد البيانات من مايكروسوفت. على سبيل المثال نستطيع باستخدام خدمات SSIS قراءة البيانات من مصادر مختلفة ومن ثم نخزن البيانات ضمن جداول . ممكن قراءة البيانات من ملفات csv إو ملفات excel او ملفات access او أنواع ملفات أخرى تخزن البيانات بشكل مرتب و معد للتكامل. كذلك نستطيع قراءة البيانات من قاعدة بيانات أخرى من نوع SQL SERVER وخزنها في قاعدة البيانات أو قراءة البيانات من قواعد بيانات أوراكل Oracle وخزنها ضمن قواعد بيانات مايكروسوفت وهناك تشكيلة واسعة من مصادر البيانات التي نستطيع التعامل معها باستخدام SSIS.
بالإضافة إلى مصادر البيانات المتنوعة توفر SSIS وظائف كثيرة ومتعددة مثلا تعطي إمكانية اتمتت قراءة الملفات. مثلا هناك تطبيق يقوم بإنشاء ملف من نوع CSV وبشكل يومي لخزن البيانات في قاعدة بيانات مايكروسوفت. يمكن باستخدام SSIS ان نقوم بقراءة الملف بشكل يدوي ولكن هذه العملية سوف تكون مملة وعرضة للخطاء او النسيان لأنها يجب أن تتكرر بشكل يومي. يمكن باستخدام SSIS مع ايعازات بسيطة بلغة C# ان نجعل عملية قراءة البيانات من الملفات تتم بشكل اوتوماتيكي وبدون تدخل يدوي وممكن أيضا جعل SSIS ان يقوم بارسال بريد إلكتروني يخبرنا في حالة فشل و نجاح عملية تكامل البيانات. 

كذلك يمكن استخدام SSIS للقيام بما يسمى تحويل البيانات data transformation وهذا موضوع مطول ولكن المبدأ يعتمد على تحويل أنواع البيانات بشكل يناسب متطلبات قواعد بيانات مايكروسوفت حيث أن قراءة البيانات من مصادر مختلفة قد يتطلب من القيام بعملية تحويل البيانات قبل ان نتمكن من تخزين البيانات في جداول قاعدة البيانات.

السبت، 15 ديسمبر 2018

الدرس الخامس والعشرون كتابة عبارةWHERE IN باستخدام Excel Sheet

قد يبدو عنوان الدرس غريب ، ما علاقة برنامج Excel ببرمجة قواعد البيانات ؟ يمكن استخدام برنامج الاكسل للقيام بالكثير من المهام المتعلقة ببرمجة قواعد البيانات .
مثلا اذا لدينا جدول طلبيات و لدينا قائمة ب ٥٠٠ زبون نريد أن نسترجع كل الطلبيات المتعلقة بهم . برمجيا يمكن استخدام عبارة WHERE IN للقيام بذلك ولكننا سوف نضطر لكتابة ٥٠٠ اسم خلف عبارة IN وهذا سوف يأخذ وقت طويل وقد نخطئ أثناء كتابة الأسماء. يمكن أن نستخدم الاكسل لكي يساعدنا في كتابة الأسماء وكما يلي
اولا ننسخ كل الأسماء إلى ملف اكسل ونضعها في الحقل A من ملف الاكسل.
ثانيا نستخدم الدالة التالية في الحقل B  وننسخها لكي تغطي ٥٠٠ سطر من الحقل  B
="'"&A1&"',"
حيث تعمل الدالة السابق على إضافة single quotation (') قبل الاسم ثم تضيف single quotation (') و فارزة comma (,) بعد الاسم التالي سوف نحصل على الأسماء وقد تم إعدادها لكي تستخدم ضمن عبارة WHERE IN.

ثالثا . نكتب عبارة WHERE IN ونفتح قوس عبارة IN ثم ننسخ كل محتويات الحقل B من الاكسل ونلصقها خلف القوس المفتوح .
رابعا . في آخر قيمة (رقم ٥٠٠) سوف يكون هناك comma (,) زائدة نقوم بحذفها وتغلق قوس عبارة IN وننفذ الايعاز
SELECT * FROM ORDER WHERE NAME IN (
'Ahmed',
'Mohammed',
'Ali',
'Omar',
'Ashraf')

يمكن القيام بالعديد من المهام البرمجية باستخدام برنامج الاكسل . حسب تجربتي الشخصية استخدمت برنامج الاكسل لتسهيل و تسريع كتابة العديد من الايعازات البرمجية بلغة SQL و لغة  C# ولغة Kotlin for Android حيث أن استخدام برنامج الاكسل يوفر الوقت وكذلك الدقة المطلوبة في كتابة العبارات البرمجية.
بلنسبة إلى مثالنا السابق اي استرجاع طلبيات ٥٠٠ زبون يمكن القيام بذلك بعدة طرق شرحنا في هذا الدرس الطريقة الاسهل وهي استخدام عبارة WHERE IN مع الاكسل في الدرس التالي ان شاء الله.

الخميس، 6 ديسمبر 2018

الدرس الرابع والعشرون WHERE IN and NOT IN Inner Query

في الموضوع السابق تعرفنا على عبارة IN  و NOT IN  وكما ذكرنا تستخدم العبارتان لتصفية النتائج اعتمادا على مجموعة من القيم يتم تضمينها بين قوسين كما في المثال التالي

SELECT * FROM CUTOMER WHERE COUNTRY IN ('IRAQ','EYGEPT','UAE')

يمكن استخدام عبارة IN مع مجموعة من القيم ولكن هذه القيم مخزنه في جدول ثاني. مثلا جدول الزبائن يحتوي على حقل بلد الزبون وجدول الطلبيات لا يحتوي على هذا الحقل ولكن يحتوي على حقل معرف الزبون . الان اذا اردنا معرفة جميع الطلبيات الزبائن الذين هم من العراق ؟ يمكن القيام بذلك بعدة طرق ولكن هنا سوف نناقش كيفية القيام بذلك باستخدام عبارة IN . الأمر بسيط نحتاج إلى استخدام ما يعرف بالاستعلام الداخلي INNER QUERY وهذا الاستعلام يجب أن يحقق شرط واحد وهو أن بلد الزبون هو العراق ويعيد حقل واحد فقط وهو معرف الزبون . ثم نستخدم قيم معرف الزبون (والتي سوف تحتوي على فقط الزبائن من العراق) للحصول على كل الطلبيات لهذه المجموعة من الزبائن وكما يلي
SELECT * FROM ORDERS WHERE CUST_ID IN (SELECT CUST_ID FROM CUTOMER WHERE COUNTRY ='IRAQ')

ملاحظة
ORDERS= جدول الطلبيات
CUSTOMER = جدول الزبائن

يعمل الاستعلام السابق كما يلي
اولا:  يقوم الاستعلام الداخلي بأعادة قائمة تحتوي على معرف الزبائن الذين هم من العراق

(SELECT CUST_ID FROM CUTOMER WHERE COUNTRY ='IRAQ')

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

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

كذلك يمكن استخدام NOT IN مع الاستعلام الداخلي INNER QUERY. الاستعلام التالي سوف يعيد كل طلبيات الزبائن عدى الذين هم من العراق .

SELECT * FROM ORDERS WHERE CUST_ID NOT IN (SELECT CUST_ID FROM CUTOMER WHERE COUNTRY ='IRAQ')

يعمل الاستعلام السابق كما يلي
اولا:  يقوم الاستعلام الداخلي بأعادة قائمة تحتوي على معرف الزبائن الذين هم من العراق

(SELECT CUST_ID FROM CUTOMER WHERE COUNTRY ='IRAQ')

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

الاثنين، 3 ديسمبر 2018

الدرس الثالث والعشرون WHERE IN and NOT IN

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

SELECT * FROM CUTOMER WHERE COUNTRY = 'IRAQ'

اذا اردنا تعديل المثال لكي نحصل على كل الزبائن من العراق ومصر والإمارات يمكن أن نستخدم العبارة IN للقيام بذلك وكما يلي

SELECT * FROM CUTOMER WHERE COUNTRY IN ('IRAQ','EYGEPT','UAE')

تعمل العبارة IN كما يلي. نقوم بوضع قائمة بالقيم التي نريد البحث عنها وتكون بين قوسين ( ) ويفصل بين القيم بفارزة (,) تعمل عبارة WHERE على مقارنة كل القيم الموجودة بعد عبارة IN مع قيم الحقل اذا كانت قيمة الحقل تتطابق مع اي من القيم المذكورة في عبارة IN سوف يتم تضمن السطر ضمن النتائج المعادة.  في المثال السابق سوف يتم تصفية النتائج لإعادة الزبائن  من العراق ومصر والإمارات.

هناك عبارة أخرى تستخدم لتصفية النتائج اعتمادا على أكثر من قيمة واحدة ولكن تعمل بشكل معاكس وهي عبارة NOT IN حيث تعمل على تصفية النتائج لإعادة كل الأسطر التي تملك قيم عدى القيم المذكورة في عبارة NOT IN.
SELECT * FROM CUTOMER WHERE COUNTRY NOT IN ('IRAQ','EYGEPT','UAE')

العبارة السابقة سوف تعيد كل الزبائن من كل البلدان عدى الزبائن من العراق ومصر والإمارات.

الجمعة، 30 نوفمبر 2018

الدرس الثاني والعشرون WHERE IS NULL

في الدرس السابق ناقشنا استخدام عبارة WHERE والغرض العام منها. في هذا الدرس سوف نتطرق إلى استخدام عبارة WHERE مع معامل مهم وهو (IS NULL) . في الدروس السابقة تطرقنا إلى مفهوم القيمة الخالية او NULL وهي تختلف كليا عن قيمة الصفر او قيمة العبارة الخالية ('') . مثلا اذا كان لدينا جدول يمتلك حقل من نوع INT فإن هذا الحقل يخزن الاعداد الصحيحة وبضمنها الصفر وكذلك يمكن أن يخزن القيمة الخالية NULL اذا تم إعداد هذا الحقل لخزن القيمة الخالية. ان نظام إدارة قواعد البيانات سوف يعامل قيمة الصفر بشكل مختلف عن قيمة NULL.  مثلا اذا اردنا استعادة كل الأسطر التي تمتلك قيمة صفر في هذا الحقل يمكن كتابة الاستعلام التالي
SELECT * FROM TABLE1 WHERE COL1=0

هذا الاستعلام سوف يعيد كل الأسطر التي تمتلك قيمة صفر في العمود COL1 . ولكن لن يعيد الأسطر التي تمتلك قيمة NULL  في الحقل COL1.

لاستعادة الأسطر التي تمتلك قيمة NULL في الحقل COL1 نستخدم معامل IS NULL (يجب ترك مسافة بين كلمة IS وكلمة NULL )

SELECT * FROM TABLE1 WHERE COL1 IS NULL

سوف يعيد الاستعلام كل الأسطر التي تمتلك قيمة خالية ولكن سوف لا يعيد الأسطر التي تمتلك قيمة صفر في هذا الحقل.

الان لو أردنا أن نعيد كل الأسطر التي تمتلك قيمة صفر والتي تمتلك قيمة خالية ؟
يمكن القيام بذلك بعدة طرق وكما يلي
اولا : نستخدم شرطين و يتم تحقيقها باستخدام المعامل المنطقي OR
SELECT * FROM TABLE1 WHERE (COL1 IS NULL ) OR (COL1 =0)
في الاستعلام السابق سوف يعيد كل الأسطر التي تمتلك قيمة صفر في هذا الحقل او التي تمتلك قيمة خالية.

ثانيا: يمكن استخدام تحويل البيانات data transformation هناك دالة في SQL Server  اسمها ISNULL (ملاحظة هنا تكتب كلمة IS ملاصقة لكلمة NULL وبدون مسافة فاصلة) هذه الدالة تعطينا الخيار باستبدال او تحويل قيمة NULL  إلى قيمة أخرى مثل صفر في الحقول العددية او عبارة خالية في الحقول النصية او تاريخ محدد في حقول التواريخ وهكذا والصيغة العامة لهذه الدالة كما يلي
ISNULL(COLUMN NAME, NEW VALUE)

اي نفتح قوس ثم اسم حقل البيانات ثم فاصلة ثم القيمة الجديدة وكما يلي
ISNULL (COL1, 0)

هنا سوف يقوم نظام إدارة قواعد البيانات بفحص قيم الحقل COL1 فأذا كانت القيمة NULL سوف يستبدلها بصفر واذا كانت اي قيمة أخرى غير NULL سوف يبقيها كما هي لذلك عند استخدام هذه الدالة مع عبارة WHERE سوف تعيد كل الأسطر التي تمتلك قيمة صفر وبضمنها الأسطر التي تمتلك قيمة خالية لأننا حولنا القيمة  الخالية إلى قيمة صفر .
SELECT * FROM TABLE1 WHERE ISNULL(COL1,0)=0

يمكن أن نستخدم الدالة  ISNULL ضمن عبارة SELECT وهي سوف تعمل بشكل مشابه حيث تقوم بفحص قيم الحقل COL1 فأذا كانت القيمة NULL سوف يستبدلها بصفر واذا كانت اي قيمة أخرى غير NULL سوف يبقيها كما هي
SELECT ISNULL(COL1,0),* FROM TABLE1 WHERE ISNULL(COL1,0)=0

الأربعاء، 28 نوفمبر 2018

الدرس الواحد والعشرون عبارة WHERE

تعتبر عبارة WHERE من أهم عناصر برمجة قواعد البيانات. الغرض الأساسي من هذه العبارة هي تصفية ( فلترة ) البيانات التي تعيدها عبارة SELECT. يمكن استخدام عبارة WHERE بشكل منفرد او استخدامها مع عبارات أخرى مثل عبارة IN او عبارة NOT IN او مع عوامل تصفية مثل (= ، <،>،<= ، >= ) والعوامل المنطقية مثل ( AND , OR) وعوامل أخرى مثل (BETWEEN , LIKE , NOT LIKE) سوف نشرح لاحقا هذه الاستخدامات بشكل مفصل.

كذلك تستخدم عبارة WHERE في عمليات معالجة البيانات DML مثلا تستخدم مع عبارة UPDATE لحصر الاسطر التي نيرد تطبيق التحديثات عليها و تستخدم مع عبارة DELETE لحصر الاسطر التي نريد حذفها من قاعدة البيانات. 

الصيغة المبسطة لأستخدام عبارة WHERE هي كما يلي

SELECT * FROM TABLE1 WHERE CONDITIONS 

الشروط او conditions هي التي سوف تستخدمها عبارة WHERE في عملية تصفية اسطر البيانات . فذا كانت الاسطر تتوافق مع الشروط سوف يقوم نظام قواعد البيانات بتضمين هذه الاسطر ضمن مجموعة الاسطر التي تعيدها عبارة SELECT واذا كانت الاسطر غير متوافقة مع الشروط سوف يتم اهمال هذه الاسطر. 

في المثال التالي سوف نستخدم عبارة WHERE للحصول على كل الطلبيات الخاصة بزبون معين (معرف الزبون = 29825)

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [CustomerID]='29825'


كما نشاهد في الصورة السابقة قام  نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة حقل معرف الزبون تساوي 29825  ([CustomerID]='29825'). اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي تعود للزبون رقم 29825

في المثال التالي سوف نستخدم عامل اخر في عملية تصفية البيانات وهو اكبر >


SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] >150000


كما نشاهد في الصورة السابقة قام  نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة المبلغ الاجمالي اكبر من 150000 الف
اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي اكبر من 150000

ملاحظة: بما اننا استخدمنا معامل اكبر فقط بدون مساواة فأذا كان هناك سطر يمتلك قيمة مبلغ اجمالي تساوي بلضبط 150000 سوف لا يتم تضمين هذا السطر لانه لا يطابق الشرط.

في المثال التالي سوف نستخدم عامل اخر في عملية تصفية البيانات وهو اكبر او يساوي  >=

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] >=150000
سوف يقوم نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة المبلغ الاجمالي اكبر او تساوي  150000 الف
اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي اكبر او تساوي 150000

ملاحظة: بما اننا استخدمنا معامل اكبر مع المساواة  فأذا كان هناك سطر يمتلك قيمة مبلغ اجمالي تساوي بلضبط 150000 سوف يتم تضمين هذا السطر لانه  يطابق الشرط.

في المثال التالي سوف نستخدم عاملين عملية تصفية البيانات وهو اصغر < و اصغر أو يساوي <=


SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] <10

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي أصغر من 10

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] <=10

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي أصغر أو يساوي 10

في المثال الاخير سوف نستخدم عامل عدم المساواة < > 

 SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE OnlineOrderFlag <>0

سوف يقوم نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة حقل OnlineOrderFlag لا تساوي صفر. طبعا هذا حقل خاص يستخدم للتمييز بين الطلبات التي يتم استلامها من الزبائن اثناء زيارتهم للمتجر (OnlineOrderFlag =0) او الطلبات التي يتم استلامها من خلال الانترنت (OnlineOrderFlag =1)

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الطلبات التي تم أستلامها من خلال الانترنت

الأحد، 25 نوفمبر 2018

الدرس العشرين SELECT TOP INTO

في هذا الدرس سوف نتطرق إلى استخدام عبارتين بشكل مزدوج وهي عبارة TOP مع عبارة INTO مع عبارة SELECT .
كما يلي
SELECT TOP 1000 * INTO TABLE2 FROM TABLE1

١- سوف يقوم بتنفيذ استعلام SELECT على الجدول الأول TABLE1 لاستعادة اول ١٠٠٠ سطر من الجدول TABLE1 و كل حقول هذا الجدول وذلك لأننا استخدمنا * .

٢- سوف يقوم بتكوين جدول جديد بأسم TABLE2 ويكون تكوين هذا الجدول من ناحية أسماء الحقول ونوع البيانات صورة طبق الأصل من الجدول TABLE1.

٣- سوف يقوم بعملية نسخ البيانات (١٠٠٠ سطر) التي استعادها من عبارة SELECT ويقوم بخزن هذه الصفوف في الجدول الجديد TABLE2.

يمكن استخدام هذه الصيغة SELECT TOP INTO في تنفيذ بعض المهام . مثلا اذا كان TABLE1 يحتوي على ٣ ملايين سطر ونريد استخراج البيانات وخزنها في ملف اكسل. سوف نواجه مشكلة وهي ان ملف الاكسل يستطيع أن يخزن فقط مليون و ٢٠٠ ألف سطر تقريبا . لذا في هذه الحالة يجب أن نستخرج البيانات ونوزعها على ثلاث ملفات اكسل وفي كل ملف نضع مليون سطر. والقيام بذلك نحتاج إلى توزيع البيانات المخزنة في الجدول TABLE1 على ثلاث جداول و في كل جدول نضع مليون سطر فقط . ثم نقوم باستخراج البيانات من الجداول الثلاثة و وخزنها في ثلاثة ملفات اكسل.

يمكن أن توزع ٣ ملايين سطر من الجدولTABLE 1 كما يلي
نفرض ان الجدول TABLE1 لا يحتوي على حقل فريد او اي مفتاح أساسي لذا الخطوة الأولى هي ان نضيف حقل ذو قيمة فريدة UNIQUE  إلى الجدول TABLE1 عن طريق استخدام محدد القيمة الفريدة وكما يلي
ALTER TABLE TABLE1 ADD ID INT IDENTITY (1,1)

تعمل العبارة السابقة على إضافة حقل اسمه ID إلى الجدول TABLE1 وهذا الحقل سوف يحتوي على قيم فريدة من ١ الى ٣ ملايين . مثلا في السطر الأول تكون قيمة الحقل ID هي ١ وفي السطر الثاني قيمة ID هي ٢ وهكذا في السطر الاخير تكون قيمة الحقل هي ٣٠٠٠٠٠٠

ثم ننفذ العبارات التالية بالتسلسل
SELECT TOP 1000000 * INTO TABLE2 FROM TABLE1

SELECT TOP 1000000 * INTO TABLE3 FROM TABLE1 WHERE ID NOT IN ( SELECT ID FROM TABLE2)

SELECT TOP 1000000 * INTO TABLE4 FROM TABLE1 WHERE ID NOT IN ( SELECT ID FROM TABLE2 UNION SELECT ID FROM TABLE3)

تعمل العبارات الثلاث السابقة على تنفيذ المهام التالية
اولا العبارة الأولى سوف تأخذ اول مليون سطر من الجدول TABLE1 وتخزينها في جدول TABLE2.

أما العبارة الثانية فسوف تأخذ ثاني مليون سطر من الجدول TABLE1 وتخزينها في جدول TABLE3 . حيث سوف يقوم النظام باختيار الأسطر التي تكون فيها قيمة ID غير موجودة في الجدول TABLE2 وهي الأسطر من 1000001 الى 2000000 لان الجدول TABLE2 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 1000000

أما العبارة الثالثة فسوف تأخذ ثالث مليون سطر من الجدول TABLE1 وتخزينها في الجدول TABLE4
حيث سوف يقوم النظام باختيار الأسطر التي تكون فيها قيمة ID غير موجودة في الجدول TABLE2 و الجدول TABLE3 وهي الأسطر من 2000001 الى 3000000 لان الجدول TABLE2 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 1000000 والجدول TABLE3 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 2000000 .

الان وبعدما قسمنا الأسطر على  ثلاث جداول TABLE2 و TABLE3 و TABLE4 يمكن بسهولة استخراج البيانات وتوزيعها على ثلاث ملفات اكسل.