إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تمكّنك مجموعات Synapse المزودة من SQL والتي لا تحتوي على خادم من وضع منطق معالجة البيانات المعقدة في إجراءات SQL المخزنة. تعد الإجراءات المخزنة طريقة رائعة لتغليف كود SQL الخاص بك وتخزينه بالقرب من بياناتك في مستودع البيانات. تساعد الإجراءات المخزنة المطورين على توحيد حلولهم من خلال تغليف الكود في وحدات يمكن إدارتها، وتسهيل إعادة استخدام الكود بشكل أكبر. يمكن أن يقبل كل إجراء مخزن أيضًا معلمات لجعلها أكثر مرونة. ستجد في هذه المقالة بعض النصائح لتنفيذ الإجراءات المخزنة في مجمع Synapse SQL لتطوير الحلول.
ما المتوقع
يدعم Synapse SQL العديد من ميزات T-SQL المستخدمة في SQL Server. والأهم من ذلك، أن هناك ميزات محددة قابلة للتوسيع يمكنك استخدامها لزيادة أداء الحل الخاص بك. في هذه المقالة، ستتعرف على الميزات التي يمكنك وضعها في الإجراءات المخزنة.
ملاحظة
في نص الإجراء، يمكنك فقط استخدام الميزات المدعومة في مساحة سطح Synapse SQL. راجع هذه المقالة للتعرف على العناصر والبيانات التي يمكن استخدامها في الإجراءات المخزنة. تستخدم الأمثلة الواردة في هذه المقالات ميزات عامة متوفرة في كل من مساحة السطح غير المجهزة بخادم والمخصصة. راجع القيود الإضافية في تجمعات SQL Synapse المزودة والتي لا تحتوي على خادم في نهاية هذه المقالة.
للحفاظ على مقياس وأداء مجمع SQL، هناك أيضًا بعض الميزات والوظائف التي لها اختلافات سلوكية وأخرى غير مدعومة.
الإجراءات المخزنة في Synapse SQL
في المثال التالي، يمكنك رؤية الإجراءات التي تسقط الكائنات الخارجية إذا كانت موجودة في قاعدة البيانات:
CREATE PROCEDURE drop_external_table_if_exists @name SYSNAME
AS BEGIN
IF (0 <> (SELECT COUNT(*) FROM sys.external_tables WHERE name = @name))
BEGIN
DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL TABLE ' + @name;
EXEC sp_executesql @tsql = @drop_stmt;
END
END
GO
CREATE PROCEDURE drop_external_file_format_if_exists @name SYSNAME
AS BEGIN
IF (0 <> (SELECT COUNT(*) FROM sys.external_file_formats WHERE name = @name))
BEGIN
DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL FILE FORMAT ' + @name;
EXEC sp_executesql @tsql = @drop_stmt;
END
END
GO
CREATE PROCEDURE drop_external_data_source_if_exists @name SYSNAME
AS BEGIN
IF (0 <> (SELECT COUNT(*) FROM sys.external_data_sources WHERE name = @name))
BEGIN
DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL DATA SOURCE ' + @name;
EXEC sp_executesql @tsql = @drop_stmt;
END
END
يمكن تنفيذ هذه الإجراءات باستخدام عبارة EXEC حيث يمكنك تحديد اسم الإجراء والمعلمات:
EXEC drop_external_table_if_exists 'mytest';
EXEC drop_external_file_format_if_exists 'mytest';
EXEC drop_external_data_source_if_exists 'mytest';
يوفر Synapse SQL تنفيذ إجراء مخزن مبسط ومبسط. الاختلاف الأكبر مقارنة بـ SQL Server هو أن الإجراء المخزن ليس رمزًا مُجمَّعًا مسبقًا. في مستودعات البيانات، يكون وقت التجميع صغيرًا مقارنة بالوقت الذي يستغرقه تشغيل الاستعلامات مقابل أحجام البيانات الكبيرة. من الأهمية بمكان التأكد من تحسين رمز الإجراء المخزن بشكل صحيح للاستعلامات الكبيرة. الهدف هو توفير الساعات والدقائق والثواني وليس المللي ثانية. لذلك من المفيد التفكير في الإجراءات المخزنة كحاويات لمنطق SQL.
عندما ينفذ Synapse SQL الإجراء المخزن الخاص بك، يتم تحليل جمل SQL وترجمتها وتحسينها في وقت التشغيل. خلال هذه العملية، يتم تحويل كل عبارة إلى استعلامات موزعة. رمز SQL الذي يتم تنفيذه على البيانات يختلف عن الاستعلام المقدم.
غلف قواعد التحقق من الصحة
تمكّنك الإجراءات المخزنة من تحديد موقع منطق التحقق في وحدة نمطية واحدة مخزنة في قاعدة بيانات SQL. في المثال التالي، يمكنك معرفة كيفية التحقق من صحة قيم المعلمات وتغيير قيمها الافتراضية.
CREATE PROCEDURE count_objects_by_date_created
@start_date DATETIME2,
@end_date DATETIME2
AS BEGIN
IF( @start_date >= GETUTCDATE() )
BEGIN
THROW 51000, 'Invalid argument @start_date. Value should be in past.', 1;
END
IF( @end_date IS NULL )
BEGIN
SET @end_date = GETUTCDATE();
END
IF( @start_date >= @end_date )
BEGIN
THROW 51000, 'Invalid argument @end_date. Value should be greater than @start_date.', 2;
END
SELECT
year = YEAR(create_date),
month = MONTH(create_date),
objects_created = COUNT(*)
FROM
sys.objects
WHERE
create_date BETWEEN @start_date AND @end_date
GROUP BY
YEAR(create_date), MONTH(create_date);
END
سيقوم المنطق في إجراء sql بالتحقق من صحة معلمات الإدخال عند استدعاء الإجراء.
EXEC count_objects_by_date_created '2020-08-01', '2020-09-01'
EXEC count_objects_by_date_created '2020-08-01', NULL
EXEC count_objects_by_date_created '2020-09-01', '2020-08-01'
-- Error
-- Invalid argument @end_date. Value should be greater than @start_date.
EXEC count_objects_by_date_created '2120-09-01', NULL
-- Error
-- Invalid argument @start_date. Value should be in past.
تعشيش الإجراءات المخزنة
عندما تستدعي الإجراءات المخزنة إجراءات مخزنة أخرى، أو تنفذ SQL ديناميكيًا، يُقال إن الإجراء المخزن الداخلي أو استدعاء التعليمات البرمجية متداخلاً. يظهر مثال على إجراء متداخل في التعليمات البرمجية التالية:
CREATE PROCEDURE clean_up @name SYSNAME
AS BEGIN
EXEC drop_external_table_if_exists @name;
EXEC drop_external_file_format_if_exists @name;
EXEC drop_external_data_source_if_exists @name;
END
يقبل هذا الإجراء معلمة تمثل بعض الأسماء ثم يستدعي إجراءات أخرى لإسقاط الكائنات بهذا الاسم. يدعم تجمع Synapse SQL بحد أقصى ثمانية مستويات متداخلة. هذه الإمكانية مختلفة قليلاً عن SQL Server. مستوى العش في SQL Server هو 32.
استدعاء الإجراء المخزن ذي المستوى الأعلى يعادل تداخل المستوى 1.
EXEC clean_up 'mytest'
إذا أجرى الإجراء المخزن أيضًا مكالمة EXEC أخرى، يرتفع مستوى العش إلى اثنين.
CREATE PROCEDURE clean_up @name SYSNAME
AS
EXEC drop_external_table_if_exists @name -- This call is nest level 2
GO
EXEC clean_up 'mytest' -- This call is nest level 1
إذا نفذ الإجراء الثاني بعض لغة SQL الديناميكية، فإن مستوى العش يرتفع إلى ثلاثة.
CREATE PROCEDURE drop_external_table_if_exists @name SYSNAME
AS BEGIN
/* See full code in the previous example */
EXEC sp_executesql @tsql = @drop_stmt; -- This call is nest level 3
END
GO
CREATE PROCEDURE clean_up @name SYSNAME
AS
EXEC drop_external_table_if_exists @name -- This call is nest level 2
GO
EXEC clean_up 'mytest' -- This call is nest level 1
ملاحظة
Synapse SQL لا يدعم حاليًا @@NESTLEVEL. تحتاج إلى تتبع مستوى العش. من غير المحتمل أن تتجاوز الحد الأقصى لمستوى العش الثمانية، ولكن إذا قمت بذلك، فأنت بحاجة إلى إعادة صياغة التعليمات البرمجية الخاصة بك لتلائم مستويات التداخل ضمن هذا الحد.
INSERT..EXECUTE
لا يسمح تجمع SQL Synapse المزوَّد لك باستهلاك مجموعة نتائج إجراء مخزن بعبارة INSERT. هناك طريقة بديلة يمكنك استخدامها. للحصول على مثال، راجع المقالة حول الجداول المؤقتة لتجمع Synapse SQL الذي تم تكوينه.
التقييدات
هناك بعض جوانب إجراءات Transact-SQL المخزنة التي لم يتم تنفيذها في Synapse SQL، مثل:
| الميزة/الخيار | متوفر | دون خادم |
|---|---|---|
| الإجراءات المخزنة المؤقتة | لا | نعم |
| ترقيم الإجراءات المخزنة | لا | لا |
| الإجراءات المخزنة الموسعة | لا | لا |
| إجراءات CLR المخزنة | لا | لا |
| خيار التشفير | لا | نعم |
| خيار النسخ المتماثل | لا | لا |
| المعلمات ذات القيمة الجدولية | لا | لا |
| معلمات للقراءة فقط | لا | لا |
| المعلمات الافتراضية | لا | نعم |
| سياقات التنفيذ | لا | لا |
| بيان العودة | لا | نعم |
| أدخل في .. EXEC | لا | نعم |
الخطوات التالية
لمزيد من نصائح التطوير، راجع نظرة عامة على التطوير.