متغيرات SQL: تعريف المتغيرات وتعيينها واختيارها في SQL Server

⚡ ملخص ذكي

متغيرات SQL Server هي كائنات مُسماة تعمل كعناصر نائبة لقيمة بيانات واحدة في الذاكرة. يجب تعريف المتغير باستخدام عبارة DECLARE قبل إسناد قيمة إليه وإعادة استخدامه.

  • 📦 فريف: يحتوي متغير SQL Server على قيمة واحدة ويعمل كعنصر نائب لموقع في الذاكرة.
  • ؟؟؟؟ محلياً وعالمياً: يدعم SQL Server المتغيرات المحلية التي تبدأ بـ @ والتي يعلن عنها المستخدمون، والمتغيرات العامة التي يديرها النظام والتي تبدأ بـ @@.
  • 📝 يعلن: تقوم عبارة DECLARE بإنشاء متغير، وبشكل افتراضي، تقوم بتهيئته إلى NULL.
  • 🔀 ثلاث طرق للتخصيص: يمكن تعيين قيمة أثناء DECLARE، أو باستخدام SET، أو باستخدام SELECT.
  • 🔎 الاستعلامات الفرعية العددية: يمكن لكل من SET و SELECT قراءة قيمة واحدة من استعلام إلى متغير.
  • 🧠 SET مقابل SELECT: تقوم الدالة SET بتعيين متغير واحد وتتبع معيار ANSI، بينما يمكن للدالة SELECT تعيين عدة متغيرات في وقت واحد.

متغيرات SQL Server: DECLARE و SET و SELECT

ما هو المتغير في SQL Server؟

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

أنواع المتغيرات في SQL: المحلية والعالمية

يحتوي خادم MS SQL على نوعين من المتغيرات:

  • متغير محلي
  • المتغير العام

مع ذلك، لا يمكن للمستخدم إنشاء سوى متغير محلي. يوضح الشكل أدناه نوعي المتغيرات المتاحة في خادم MS SQL.

رسم تخطيطي لنوعي المتغيرات في SQL Server: المتغيرات المحلية والمتغيرات العامة

متغير محلي

  • يعلن المستخدم عن المتغير المحلي.
  • بشكل افتراضي، يبدأ اسم المتغير المحلي بـ @.
  • يتم تحديد نطاق كل متغير محلي للدفعة أو الإجراء الحالي ضمن جلسة معينة.

المتغير العام

  • يحتفظ النظام بالمتغير العام؛ ولا يمكن للمستخدم تعريف متغير عام.
  • يبدأ اسم المتغير العام بـ @@.
  • يخزن معلومات متعلقة بالجلسة.

كيفية الإعلان عن متغير في SQL

قبل استخدام أي متغير في دفعة أو إجراء في SQLيجب عليك تعريف المتغير. يُنشئ الأمر DECLARE متغيرًا يعمل كعنصر نائب لموقع في الذاكرة. ولا يُمكن استخدام المتغير في الجزء اللاحق من العملية أو الإجراء إلا بعد تعريفه.

بناء جملة TSQL:

DECLARE  { @LOCAL_VARIABLE[AS] data_type  [ = value ] }

قواعد:

  • التهيئة اختيارية أثناء التصريح.
  • بشكل افتراضي، يقوم الأمر DECLARE بتهيئة المتغير إلى NULL.
  • يعد استخدام الكلمة الأساسية "AS" أمرًا اختياريًا.
  • لتعريف أكثر من متغير محلي، أضف فاصلة بعد التعريف الأول، ثم أعط اسم المتغير التالي و نوع البيانات.

أمثلة على الإعلان عن المتغير

الاستعلام: مع "AS"

DECLARE @COURSE_ID AS INT;

الاستعلام: بدون "AS"

DECLARE @COURSE_NAME VARCHAR (10);

الاستعلام: قم بتعريف متغيرين

DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);

تعيين قيمة لمتغير SQL

يمكنك تعيين قيمة لمتغير بثلاث طرق:

  • أثناء تعريف المتغيرات باستخدام الكلمة المفتاحية DECLARE.
  • باستخدام مجموعة.
  • باستخدام SELECT.

دعونا نلقي نظرة على الطرق الثلاث بالتفصيل.

أثناء إعلان المتغير باستخدام الكلمة الأساسية DECLARE

بناء جملة T-SQL:

DECLARE { @Local_Variable [AS] Datatype [ = value ] }

هنا، بعد نوع البيانات يمكنك استخدام '=' متبوعًا بالقيمة المراد تعيينها.

الاستعلام:

DECLARE @COURSE_ID AS INT = 5
PRINT @COURSE_ID

يؤدي تشغيل الاستعلام إلى طباعة القيمة التي تم تعيينها أثناء الإعلان، كما هو موضح أدناه.

مخرجات متغير تم تعيينه أثناء عملية DECLARE، حيث يتم طباعة القيمة 5

استخدام متغير SQL SET

أحيانًا نرغب في فصل عملية تعريف المتغير عن عملية تهيئته. تقوم الدالة SET بتعيين قيمة للمتغير بعد تعريفه. فيما يلي الطرق المختلفة لتعيين القيم باستخدام SET.

مثال: إسناد قيمة لمتغير باستخدام الأمر SET

بناء الجملة:

DECLARE @Local_Variable <Data_Type>
SET @Local_Variable =  <Value>

الاستعلام:

DECLARE @COURSE_ID AS INT
SET @COURSE_ID = 5
PRINT @COURSE_ID

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

ناتج إسناد قيمة لمتغير باستخدام الأمر SET، طباعة 5

مثال: تعيين قيمة لمتغيرات متعددة باستخدام الأمر SET

بناء الجملة:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable_2 <Data_Type>,
SET @Local_Variable_1 = <Value_1>
SET @Local_Variable_2 = <Value_2>

القاعدة: يمكن لكلمة SET واحدة أن تُسند قيمة لمتغير واحد فقط.

الاستعلام:

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SET @COURSE_ID = 5
SET @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

تقوم عبارتا الطباعة (PRINT) بإرجاع القيمتين المعينتين، كما هو موضح أدناه.

مخرجات تعيين متغيرين باستخدام الأمر SET، وطباعة الرقم 5، ونظام يونكس.

مثال: إسناد قيمة لمتغير باستخدام استعلام فرعي عددي باستخدام SET

بناء الجملة:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable_2 <Data_Type>,SET @Local_Variable_1 = (SELECT <Column_1> from <Table_Name> where <Condition_1>)

قواعد:

  • ضع الاستعلام بين قوسين.
  • يجب أن يكون الاستعلام استعلامًا عدديًا، أي أنه يُرجع صفًا واحدًا وعمودًا واحدًا فقط. وإلا، فسيُظهر الاستعلام خطأً.
  • إذا أعاد الاستعلام صفر صفوف، فسيتم تعيين المتغير إلى EMPTY، أي NULL.

لنفترض أن لدينا جدول اسم الشيئ 'Guruجدول مكون من عمودين، كما هو موضح أدناه. يُستخدم هذا الجدول في الأمثلة التالية.

Guruالجدول رقم 99 الذي يحتوي على عمودين هما Tutorial_ID و Tutorial_name، والمستخدم في الأمثلة

مثال 1: عندما تُرجع الاستعلامات الفرعية صفًا واحدًا كنتيجة

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3)
PRINT @COURSE_NAME

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

مخرجات استعلام فرعي عددي مُعين باستخدام SET، مع طباعة اسم البرنامج التعليمي المطابق

مثال 2: عندما تُرجع الاستعلامات الفرعية صفر صفوف كنتيجة

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

لأن الاستعلام الفرعي لا يُرجع أي صفوف، فإن قيمة المتغير فارغة، أي NULL، لذلك لا يتم طباعة أي شيء، كما هو موضح أدناه.

ناتج استعلام فرعي عددي من نوع SET لا يُرجع أي صفوف، مما يجعل المتغير NULL

استخدام متغير SELECT في SQL

تمامًا كما هو الحال مع الأمر SET، يمكنك أيضًا استخدام الأمر SELECT لتعيين قيم للمتغيرات بعد تعريفها باستخدام الأمر DECLARE. فيما يلي طرق مختلفة لتعيين قيمة باستخدام الأمر SELECT.

مثال: إسناد قيمة إلى متغير باستخدام SELECT

بناء الجملة:

DECLARE @LOCAL_VARIABLE <Data_Type>
SELECT @LOCAL_VARIABLE = <Value>

الاستعلام:

DECLARE @COURSE_ID INT
SELECT @COURSE_ID = 5
PRINT @COURSE_ID

تقوم عملية تحديد القيمة بطباعة القيمة، كما هو موضح أدناه.

ناتج إسناد قيمة إلى متغير باستخدام SELECT، طباعة 5

مثال: إسناد قيمة إلى متغيرات متعددة باستخدام SELECT

بناء الجملة:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Value_1>,  @Local_Variable _2 = <Value_2>

القاعدة: على عكس الأمر SET، يمكن للأمر SELECT تعيين قيمة لمتغيرات متعددة مفصولة بفواصل.

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

يتم تعيين كلا المتغيرين في استعلام SELECT واحد، كما هو موضح أدناه.

ناتج تعيين متغيرين باستخدام استعلام SELECT واحد، طباعة 5 و UNIX

مثال: إسناد قيمة إلى متغير باستخدام استعلام فرعي باستخدام SELECT

بناء الجملة:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = (SELECT <Column_1> from <Table_name> where <Condition_1>)

قواعد:

  • ضع الاستعلام بين قوسين.
  • يجب أن يكون الاستعلام استعلامًا عدديًا يُرجع صفًا واحدًا وعمودًا واحدًا. وإلا، فسيُظهر الاستعلام خطأً.
  • إذا أعاد الاستعلام صفر صفوف، فإن المتغير يكون فارغًا، أي NULL.

أعد النظر في "Guruطاولة 99'.

مثال 1: عندما تُرجع الاستعلامات الفرعية صفًا واحدًا كنتيجة

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1)
PRINT @COURSE_NAME

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

مخرجات استعلام فرعي عددي مُعين باستخدام SELECT، مع طباعة اسم البرنامج التعليمي المطابق

مثال 2: عندما تُرجع الاستعلامات الفرعية صفر صفوف كنتيجة

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

في حالة عدم وجود صف مطابق، يظل المتغير فارغًا، أي NULL، كما هو موضح أدناه.

ناتج استعلام فرعي عددي SELECT لا يُرجع أي صفوف، مما يجعل المتغير NULL

مثال 3: إسناد قيمة إلى متغير باستخدام عبارة SELECT عادية

بناء الجملة:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Column_1> from <Table_name> where <Condition_1>

قواعد:

  • بخلاف الأمر SET، إذا أعاد الاستعلام عدة صفوف، فسيتم تعيين قيمة المتغير إلى قيمة الصف الأخير.
  • إذا أعاد الاستعلام صفر صفوف، فسيتم تعيين المتغير إلى EMPTY، أي NULL.

الاستعلام 1: يُرجع الاستعلام صفًا واحدًا

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3
PRINT @COURSE_NAME

يقوم الصف المطابق الوحيد بتعيين قيمة المتغير، كما هو موضح أدناه.

ناتج عملية SELECT عادية تُرجع صفًا واحدًا

الاستعلام الثاني: يُرجع الاستعلام عدة صفوف

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99
PRINT @COURSE_NAME

عندما تتطابق عدة صفوف، يحتفظ المتغير بالقيمة من الصف الأخير، كما هو موضح أدناه.

مخرجات استعلام SELECT عادي يُرجع عدة صفوف، احتفظping قيمة الصف الأخير

الاستعلام 3: يُرجع الاستعلام صفر صفوف

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5
PRINT @COURSE_NAME

عندما لا تتطابق أي صفوف، يكون المتغير فارغًا، أي NULL، كما هو موضح أدناه.

ناتج استعلام SELECT عادي لا يُرجع أي صفوف، مما يجعل المتغير NULL

أمثلة أخرى لمتغيرات SQL

يمكن أيضًا استخدام متغير مُعلن داخل استعلام، على سبيل المثال في عبارة WHERE لتصفية الصفوف.

الاستعلام:

DECLARE @COURSE_ID Int = 1
SELECT * from Guru99 where Tutorial_id = @COURSE_ID

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

ناتج استخدام متغير في عبارة WHERE لتصفية Guruجدول 99

حقائق مثيرة للاهتمام حول متغيرات SQL Server!

  • يمكن عرض متغير محلي باستخدام الأمر PRINT وكذلك الأمر SELECT.
  • لا يسمح نوع بيانات الجدول باستخدام 'AS' أثناء الإعلان.
  • يتوافق الأمر SET مع معايير ANSI، بينما لا يتوافق الأمر SELECT معها.
  • يُسمح أيضاً بإنشاء متغير محلي باسم @. على سبيل المثال، يمكن تعريفه على النحو التالي:
'DECLARE @@ as VARCHAR (10)'

الأسئلة الشائعة

بعد تنفيذ أمر DECLARE دون إسناد قيمة، يحتفظ متغير SQL Server بالقيمة NULL. المتغير موجود ولكنه لا يحمل قيمة حتى يتم إسناد قيمة له باستخدام DECLARE مع = أو SET أو SELECT. الإشارة إليه قبل الإسناد تُرجع القيمة NULL.

عندما لا تُرجع الاستعلامات الفرعية أي صفوف، تُعيّن عبارة SET قيمة NULL وتستبدل أي قيمة حالية. أما عبارة SELECT فتُبقي المتغير دون تغيير، وتحتفظ به.ping بغض النظر عن القيمة التي كانت تحملها بالفعل. هذا الاختلاف مهم عندما يبدأ المتغير بقيمة غير فارغة (غير NULL).

يُخزّن متغير الجدول، المُعلن عنه باستخدام DECLARE @t TABLE(…)، مجموعة نتائج صغيرة ضمن نطاق دفعة واحدة. على عكس الجدول المؤقت (#temp)، فهو موجود فقط ضمن دفعته، ولا يمكن تعديله بعد إنشائه، وغالبًا ما يكون مناسبًا لمجموعات البيانات الصغيرة.

يقتصر تعريف المتغير المحلي على الدفعة أو الإجراء المخزن أو المشغل الذي تم تعريفه فيه، وذلك ضمن جلسة واحدة. تُنهي الكلمة المفتاحية GO الدفعة، لذا لا يمكن الرجوع إلى متغير تم تعريفه قبل GO بعد ذلك.

يمكن استخدام أي متغير تقريبًا في SQL Server نوع البياناتبما في ذلك int و decimal و varchar و nvarchar و date و datetime و bit و table. قم بمطابقة المتغير مع العمود الذي يمثله لتجنب أخطاء التحويل الضمني.

أعد تعيين المتغير إلى نفسه باستخدام الأمر SET، على سبيل المثال: SET @counter = @counter + 1. يعمل الأمر SELECT أيضًا: SELECT @total = @total + price. يُشغّل هذا النمط الحلقات والمجاميع التراكمية داخل البرامج النصية والإجراءات المخزنة.

نعم. مساعد الطيار جيثب يمكن لهذه الأداة إنشاء عبارات DECLARE وSET وSELECT من التعليقات المكتوبة بلغة طبيعية، واقتراح أنواع بيانات مناسبة. يُرجى مراجعة الأسماء والأنواع ومنطق التعيين المُنشأة دائمًا مقارنةً بمخطط قاعدة البيانات قبل تشغيلها في بيئة الإنتاج.

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

تلخيص هذه التدوينة بـ: