Stored procedures using Synapse SQL in Azure Synapse Analytics

تلميح

Microsoft Fabric Data Warehouse هو مستودع علائقي على نطاق مؤسسي قائم على أساس بحيرة البيانات، مع بنية جاهزة للمستقبل، وذكاء اصطناعي مدمج، وميزات جديدة. إذا كنت جديدا في مستودع البيانات، ابدأ ب Fabric Data Warehouse. يمكن لأحمال عمل تجمع SQL المخصصة الحالية الترقية إلى Fabric للوصول إلى قدرات جديدة في علوم البيانات، والتحليلات اللحظية، والتقارير.

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

ما الذي يمكن توقعه

يدعم Synapse SQL العديد من ميزات T-SQL المستخدمة في SQL Server. والأهم من ذلك، هناك ميزات محددة للتوسع يمكنك استخدامها لتعظيم أداء حلك. في هذا المقال، ستتعرف على الميزات التي يمكنك وضعها في الإجراءات المخزنة.

ملحوظة

في جسم الإجراءات، يمكنك استخدام الميزات المدعومة فقط في Synapse SQL SURFACE area. راجع هذه المقالة لتحديد الكائنات، العبارة التي يمكن استخدامها في الإجراءات المخزنة. تستخدم الأمثلة في هذه المقالات ميزات عامة متاحة سواء في المساحة السطحية بدون خادم أو على مساحة السطح المخصصة. انظر القيود الأخرى في مجموعات Synapse SQL المتوفرة وبدون خادم في نهاية هذا المقال.

للحفاظ على حجم وأداء مجموعة 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. تحتاج إلى تتبع مستوى العش. من غير المحتمل أن تتجاوز حد المستويات الثمانية للعش، لكن إذا فعلت، عليك إعادة صياغة الكود ليتناسب مع مستويات التداخلات ضمن هذا الحد.

إدراج.. التنفيذ

لا يسمح لك مجموعة SQL الخاصة ب Synapse المتوفر باستهلاك مجموعة النتائج لإجراء مخزن باستخدام عبارة INSERT. هناك طريقة بديلة يمكنك استخدامها. على سبيل المثال، راجع مقال الجداول المؤقتة لمجموعة Synapse SQL المتوفرة.

القيود

هناك بعض جوانب الإجراءات المخزنة Transact-SQL غير مطبقة في Synapse SQL، مثل:

الميزة/الخيار توفير دون خادم
إجراءات التخزين المؤقت لا. نعم
إجراءات المخزنة المرقمة لا. لا.
إجراءات التخزين الموسعة لا. لا.
إجراءات تخزين CLR لا. لا.
خيار التشفير لا. نعم
خيار التكرار لا. لا.
المعاملات ذات القيمة الجداول لا. لا.
معلمات القراءة فقط لا. لا.
المعايير الافتراضية لا. نعم
سياقات التنفيذ لا. لا.
بيان الإرجاع لا. نعم
أدخل في .. التنفيذي لا. نعم

لمزيد من نصائح التطوير، قم بمراجعةنظرة عامة على التطوير.