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ış.