Aracılığıyla paylaş


Azure Synapse Analytics'te Synapse SQL kullanan saklı yordamlar

Synapse SQL tarafından sağlanan ve sunucusuz havuzlar, karmaşık veri işleme mantığını SQL saklı yordamlarına yerleştirmenizi sağlar. Saklı yordamlar, SQL kodunuzu kapsüllemek ve veri ambarında verilerinize yakın bir şekilde depolamak için harika bir yoldur. Saklı yordamlar, geliştiricilerin kodu yönetilebilir birimler halinde kapsülleyerek ve kodun daha fazla yeniden kullanılabilirliğini kolaylaştırarak çözümlerini modüler hale getirmelerine yardımcı olur. Her saklı yordam, daha da esnek hale getirmek için parametreleri de kabul edebilir. Bu makalede Synapse SQL havuzunda çözüm geliştirmeye yönelik saklı yordamları uygulamaya yönelik bazı ipuçları bulacaksınız.

Beklentiler

Synapse SQL, SQL Server kullanılan T-SQL özelliklerinin çoğunu destekler. Daha da önemlisi, çözümünüzün performansını en üst düzeye çıkarmak için kullanabileceğiniz ölçeği genişletmeye özgü özellikler vardır. Bu makalede, saklı yordamlara yerleştirebileceğiniz özellikler hakkında bilgi edinecek.

Not

Yordam gövdesinde yalnızca Synapse SQL yüzey alanında desteklenen özellikleri kullanabilirsiniz. Saklı yordamlarda kullanılabilecek nesneleri ve deyimi tanımlamak için bu makaleyi gözden geçirin. Bu makalelerdeki örneklerde hem sunucusuz hem de ayrılmış yüzey alanında kullanılabilen genel özellikler kullanılır. Bu makalenin sonunda sağlanan ve sunucusuz Synapse SQL havuzlarındaki ek sınırlamalara bakın.

SQL havuzunun ölçeğini ve performansını korumak için davranış farklılıkları olan bazı özellikler ve işlevler ve desteklenmeyen diğerleri de vardır.

Synapse SQL'de saklı yordamlar

Aşağıdaki örnekte, dış nesneleri veritabanında varsa bırakan yordamları görebilirsiniz:

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

Bu yordamlar, yordam adını ve parametrelerini belirtebileceğiniz deyimi kullanılarak EXEC yürütülebilir:

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, basitleştirilmiş ve kolaylaştırılmış bir saklı yordam uygulaması sağlar. SQL Server ile karşılaştırıldığında en büyük fark, saklı yordamın önceden derlenmiş kod olmamasıdır. Veri ambarlarında derleme süresi, büyük veri hacimlerinde sorgu çalıştırma süresine kıyasla küçük olur. Saklı yordam kodunun büyük sorgular için doğru şekilde iyileştirildiğinden emin olmak daha önemlidir. Amaç, milisaniye değil saat, dakika ve saniye tasarrufu yapmaktır. Bu nedenle saklı yordamları SQL mantığı için kapsayıcılar olarak düşünmek daha yararlıdır.

Synapse SQL saklı yordamınızı yürüttüğünde, SQL deyimleri çalışma zamanında ayrıştırılır, çevrilir ve iyileştirilir. Bu işlem sırasında her deyim dağıtılmış sorgulara dönüştürülür. Veriler üzerinde yürütülen SQL kodu, gönderilen sorgudan farklıdır.

Doğrulama kurallarını kapsülleme

Saklı yordamlar, SQL veritabanında depolanan tek bir modülde doğrulama mantığını bulmanıza olanak tanır. Aşağıdaki örnekte, parametrelerin değerlerini doğrulamayı ve varsayılan değerlerini değiştirmeyi görebilirsiniz.

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 yordamındaki mantık, yordam çağrıldığında giriş parametrelerini doğrular.


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.

Saklı yordamları iç içe yerleştirme

Saklı yordamlar diğer saklı yordamları çağırdığında veya dinamik SQL yürüttüğünde, iç saklı yordamın veya kod çağrısının iç içe geçtiği söylenir. aşağıdaki kodda iç içe yordam örneği gösterilmiştir:

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

Bu yordam, bir adı temsil eden bir parametreyi kabul eder ve sonra bu ada sahip nesneleri bırakmak için diğer yordamları çağırır. Synapse SQL havuzu en fazla sekiz iç içe yerleştirme düzeyini destekler. Bu özellik SQL Server biraz farklıdır. SQL Server iç içe yerleştirme düzeyi 32'dir.

Üst düzey saklı yordam çağrısı, iç içe düzey 1'e eşit.

EXEC clean_up 'mytest'

Saklı yordam başka bir EXEC çağrısı da yaparsa, iç içe geçirme düzeyi ikiye yükselir.

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

İkinci yordam daha sonra biraz dinamik SQL yürütürse, iç içe geçirme düzeyi üçe çıkar.

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

Not

Synapse SQL şu anda @@NESTLEVEL desteklememektedir. İç içe düzeyi izlemeniz gerekir. Sekiz iç içe geçme düzeyi sınırını aşmanız pek olası değildir, ancak bunu yaparsanız kodunuzu bu sınır içindeki iç içe geçme düzeylerine uyacak şekilde yeniden düzenlemeniz gerekir.

EKLE.. YÜRÜTMEK

Sağlanan Synapse SQL havuzu, insert deyimiyle saklı yordamın sonuç kümesini kullanmanıza izin vermez. Kullanabileceğiniz alternatif bir yaklaşım vardır. Örneğin, sağlanan Synapse SQL havuzu için geçici tablolarla ilgili makaleye bakın.

Sınırlamalar

Transact-SQL saklı yordamlarının Synapse SQL'de uygulanmamış bazı yönleri vardır, örneğin:

Özellik/seçenek Sağlanan Sunucusuz
Geçici saklı yordamlar Hayır Yes
Numaralandırılmış saklı yordamlar Hayır Hayır
Genişletilmiş saklı yordamlar Hayır Hayır
CLR saklı yordamları Hayır Hayır
Şifreleme seçeneği Hayır Yes
Çoğaltma seçeneği Hayır Hayır
Tablo değerli parametreler Hayır Hayır
Salt okunur parametreler Hayır Hayır
Varsayılan parametreler Hayır Yes
Yürütme bağlamları Hayır Hayır
Return deyimi Hayır Yes
INSERT INTO .. EXEC Hayır Evet

Sonraki adımlar

Daha fazla geliştirme ipucu için bkz. geliştirmeye genel bakış.