Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Synapse SQL tarafından sağlanan ve sunucusuz havuzlar, SQL saklı yordamlarına karmaşık veri işleme mantığı yerleştirmenizi sağlar. Saklı yordamlar, SQL kodunuzu kapsüllemek ve veri ambarında verilerinize yakın 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.
Neler bekleyebileceğiniz
Synapse SQL, SQL Server'da 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ı yordamlarda kullanabileceğiniz özellikler hakkında bilgi edineceksiniz.
Uyarı
Prosedür gövdesinde yalnızca Synapse SQL yüzey alanında desteklenen özellikleri kullanabilirsiniz. Saklı yordamlarda kullanılabilecek nesneleri ve ifadeleri 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. Makalenin sonunda sağlanan ve sunucusuz Synapse SQL havuzlarındaki diğer sınırlamalarına 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, var olan dış nesneleri veritabanından kaldıran 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 EXEC deyimi kullanılarak 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üçüktür. 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 ayrıştırılır, çevrilir ve çalışma zamanında 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ğırmanın iç içe yerleştirileceği söylenir. Aşağıdaki kodda iç içe geçmiş bir 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'dan biraz farklıdır. SQL Server'da iç içe geçme seviyesi 32'dir.
En üst düzey saklı yordam çağrısı, düzey 1'e eşit.
EXEC clean_up 'mytest'
Saklı yordam başka bir EXEC çağrısı da yaparsa, iç içe girme seviyesi 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 bazı dinamik SQL yürütürse, iç içe geçmişlik seviyesi üçe yükselir.
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
Uyarı
Synapse SQL şu anda @@NESTLEVELdesteklememektedir. Yuva düzeyini izlemeniz gerekir. Sekiz iç içe düzey 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..ÇALIŞTIR
Sağlanan Synapse SQL havuzu, bir INSERT ifadesiyle saklı yordamın sonuç kümesini kullanmanıza izin vermez. Kullanabileceğiniz alternatif bir yaklaşım vardır. Örnek için, önceden sağlanmış Synapse SQL havuzu için geçici tablolar makalesine bakın.
Sınırlamalar
Synapse SQL'de uygulanmamış olan Transact-SQL saklı yordamlarla ilgili bazı hususlar şunlardır:
| Özellik/seçenek | Tahsis edilen | Sunucusuz |
|---|---|---|
| Geçici saklı yordamlar | Hayı | Evet |
| Numaralandırılmış saklı yordamlar | Hayı | Hayı |
| Genişletilmiş saklı prosedürler | Hayı | Hayı |
| CLR saklı yordamları | Hayı | Hayı |
| Şifreleme seçeneği | Hayı | Evet |
| Çoğaltma seçeneği | Hayı | Hayı |
| Tablo değerli parametreler | Hayı | Hayı |
| Salt okunabilir parametreler | Hayı | Hayı |
| Varsayılan parametreler | Hayı | Evet |
| Yürütme bağlamları | Hayı | Hayı |
| return ifadesi | Hayı | Evet |
| INSERT INTO .. EXEC | Hayı | Evet |
İlgili içerik
Daha fazla geliştirme ipucu için bkz . geliştirmeye genel bakış.