Aracılığıyla paylaş


CREATE YORDAMı (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

SQL Server, Azure SQL Veritabanı, Microsoft Fabric'te SQL veritabanı ve Analytics Platform System (PDW) içinde Transact-SQL veya ortak dil çalışma zamanı (CLR) depolanan bir prosedür oluşturur. Saklı yordamlar, diğer programlama dillerindeki ve yapabilecekleri yordamlara benzer:

  • Giriş parametrelerini kabul edin ve çağırma yordamına veya toplu işleme çıkış parametreleri biçiminde birden çok değer döndürebilirsiniz.
  • Diğer yordamları çağırma da dahil olmak üzere veritabanında işlemler gerçekleştiren programlama deyimleri içerir.
  • Başarıyı veya başarısızlığı (ve başarısızlığın nedenini) belirtmek için bir çağrı yordamına veya toplu işleme durum değeri döndürme.

Geçerli veritabanında kalıcı bir yordam veya veritabanında geçici bir yordam tempdb oluşturmak için bu deyimi kullanın.

Uyarı

.NET Framework CLR'nin SQL Server ile tümleştirilmesi bu konuda ele alınmıştır. CLR entegrasyonu, Microsoft Fabric'teki Azure SQL Database veya SQL veritabanı için geçerli değildir.

Söz diziminin ayrıntılarını atlamak ve temel saklı yordamın hızlı bir örneğine ulaşmak için Basit Örnekler'e atlayın.

Transact-SQL söz dizimi kuralları

Sözdizimi

SQL Server, Azure SQL Database, SQL Fabric'te SQL veritabanı için Transact-SQL sözdizimi

CREATE [ OR ALTER ] { PROC | PROCEDURE }
    [schema_name.] procedure_name [ ; number ]
    [ { @parameter_name [ type_schema_name. ] data_type }
        [ VARYING ] [ NULL ] [ = default ] [ OUT | OUTPUT | [READONLY]
    ] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]

<procedure_option> ::=
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE AS Clause ]

CLR saklı yordamları için Transact-SQL söz dizimi:

CREATE [ OR ALTER ] { PROC | PROCEDURE }
    [schema_name.] procedure_name [ ; number ]
    [ { @parameter_name [ type_schema_name. ] data_type }
        [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ]
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Yerel olarak derlenmiş saklı yordamlar için söz dizimi Transact-SQL:

CREATE [ OR ALTER ] { PROC | PROCEDURE } [schema_name.] procedure_name
    [ { @parameter data_type } [ NULL | NOT NULL ] [ = default ]
        [ OUT | OUTPUT ] [READONLY]
    ] [ ,... n ]
  WITH NATIVE_COMPILATION, SCHEMABINDING [ , EXECUTE AS clause ]
AS
{
  BEGIN ATOMIC WITH ( <set_option> [ ,... n ] )
sql_statement [;] [ ... n ]
[ END ]
}
[;]

<set_option> ::=
    LANGUAGE = [ N ] 'language'
  | TRANSACTION ISOLATION LEVEL = { SNAPSHOT | REPEATABLE READ | SERIALIZABLE }
  | [ DATEFIRST = number ]
  | [ DATEFORMAT = format ]
  | [ DELAYED_DURABILITY = { OFF | ON } ]

Azure Synapse Analytics ve Paralel Veri Ambarı'nda saklı yordamlar için Transact-SQL söz dizimi:

CREATE { PROC | PROCEDURE } [ schema_name.] procedure_name
    [ { @parameter data_type } [ OUT | OUTPUT ] ] [ ,...n ]
AS
{
  [ BEGIN ] sql_statement [;][ ,...n ] [ END ]
}
[;]

Microsoft Fabric'te saklı yordamlar için söz dizimi Transact-SQL:

CREATE [ OR ALTER ] { PROC | PROCEDURE } [ schema_name.] procedure_name
    [ { @parameter data_type } [ OUT | OUTPUT ] ] [ ,...n ]
AS
{
  [ BEGIN ] sql_statement [;][ ,...n ] [ END ]
}
[;]

Arguments

VEYA ALTER

Şunlara uygulanır: Azure SQL Veritabanı, Microsoft Fabric'te SQL veritabanı, SQL Server (SQL Server 2016 (13.x) SP1 ile başlar).

Zaten varsa yordamı değiştirir.

schema_name

Yordamın ait olduğu şemanın adı. Yordamlar şemaya bağlıdır. Yordam oluşturulduğunda bir şema adı belirtilmezse, yordamı oluşturan kullanıcının varsayılan şeması otomatik olarak atanır.

procedure_name

Yordamın adı. Yordam adları , tanımlayıcıların kurallarına uymalıdır ve şema içinde benzersiz olmalıdır.

Dikkat

Yordamları adlandırırken ön ekin sp_ kullanılmasından kaçının. Bu ön ek, sistem yordamlarını tanımlamak için SQL Server tarafından kullanılır. Ön ekin kullanılması, aynı ada sahip bir sistem yordamı varsa uygulama kodunun bozulmasına neden olabilir.

Yerel veya genel geçici yordamlar, yerel geçici yordamlar için procedure_name önce bir sayı işareti (#procedure_name) ve genel geçici yordamlar için iki sayı işareti (##procedure_name) kullanılarak oluşturulabilir. Yerel geçici yordam yalnızca onu oluşturan bağlantı tarafından görülebilir ve bu bağlantı kapatıldığında bırakılır. Genel geçici yordam tüm bağlantılar tarafından kullanılabilir ve yordamı kullanılarak son oturumun sonunda bırakılır. CLR yordamları için geçici adlar belirtilemiyor.

Bir yordamın veya dahil olmak üzere ##genel geçici yordamın tam adı 128 karakteri aşamaz. dahil olmak üzere #yerel geçici yordamın tam adı 116 karakteri aşamaz.

; sayı

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Aynı ada sahip yordamları gruplandırmak için kullanılan isteğe bağlı bir tamsayı. Bu gruplandırılmış yordamlar bir DROP PROCEDURE deyimi kullanılarak birlikte bırakılabilir.

Uyarı

Bu özellik, SQL Server'ın gelecek bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın.

Numaralandırılmış yordamlar xml veya CLR kullanıcı tanımlı türlerini kullanamaz ve plan kılavuzunda kullanılamaz.

@ parameter_name

Yordamda bildirilen bir parametre. İlk karakter olarak at işaretini (@) kullanarak bir parametre adı belirtin. Parametre adı , tanımlayıcılar için kurallarla uyumlu olmalıdır. Parametreler yordam için yereldir; aynı parametre adları diğer yordamlarda kullanılabilir.

Bir veya daha fazla parametre bildirilebilir; maksimum değer 2.100'dür. Parametre için varsayılan bir değer tanımlanmadığı veya değerin başka bir parametreye eşit olarak ayarlanmadığı sürece, yordam çağrıldığında, bildirilen her parametrenin değeri kullanıcı tarafından sağlanmalıdır. Bir yordam tablo değerli parametreler içeriyorsa ve çağrıda parametresi eksikse, boş bir tablo geçirilir. Parametreler yalnızca sabit ifadelerin yerini alabilir; tablo adları, sütun adları veya diğer veritabanı nesnelerinin adları yerine kullanılamazlar. Daha fazla bilgi için bkz . EXECUTE (Transact-SQL).

FOR REPLICATION belirtilirse parametreler bildirilemiyor.

[ type_schema_name. ] data_type

Parametrenin veri türü ve veri türünün ait olduğu şema.

Transact-SQL yordamları için yönergeler:

  • Tüm Transact-SQL veri türleri parametre olarak kullanılabilir.
  • Tablo değerli parametreler oluşturmak için kullanıcı tanımlı tablo türünü kullanabilirsiniz. Tablo değerli parametreler yalnızca INPUT parametreleri olabilir ve READONLY anahtar sözcüğü eşlik etmelidir. Daha fazla bilgi için bkz . Table-Valued Parametrelerini Kullanma (Veritabanı Altyapısı)
  • imleç veri türleri yalnızca OUTPUT parametreleri olabilir ve VARYING anahtar sözcüğüyle birlikte verilmelidir.

CLR yordamları için yönergeler:

  • Yönetilen kodda eşdeğeri olan tüm yerel SQL Server veri türleri parametre olarak kullanılabilir. CLR türleri ile SQL Server sistem veri türleri arasındaki yazışmalar hakkında daha fazla bilgi için bkz. CLR Parametre Verilerini Eşleme. SQL Server sistem veri türleri ve söz dizimi hakkında daha fazla bilgi için bkz. Veri Türleri (Transact-SQL).

  • Tablo değerli veya imleç veri türleri parametre olarak kullanılamaz.

  • Parametrenin veri türü CLR kullanıcı tanımlı bir türse, tür üzerinde EXECUTE iznine sahip olmanız gerekir.

DEĞİŞEN

Çıkış parametresi olarak desteklenen sonuç kümesini belirtir. Bu parametre yordam tarafından dinamik olarak oluşturulur ve içeriği değişebilir. Yalnızca imleç parametreleri için geçerlidir. Bu seçenek CLR yordamları için geçerli değildir.

varsayılan

Parametre için varsayılan değer. Bir parametre için varsayılan bir değer tanımlanmışsa, yordam bu parametre için bir değer belirtilmeden yürütülebilir. Varsayılan değer sabit olmalı veya NULL olabilir. Sabit değer joker karakter biçiminde olabilir ve bu da parametreyi yordama geçirirken LIKE anahtar sözcüğünü kullanmayı mümkün hale getirir.

Varsayılan değerler yalnızca CLR yordamları için sütuna sys.parameters.default kaydedilir. Bu sütun, Transact-SQL yordam parametreleri için NULL'tır.

OUT | ÇIKTI

Parametresinin bir çıkış parametresi olduğunu gösterir. Yordamı çağırana değer döndürmek için OUTPUT parametrelerini kullanın. text, ntext ve image parametreleri, yordam bir CLR yordamı olmadığı sürece OUTPUT parametresi olarak kullanılamaz. Yordam bir CLR yordamı olmadığı sürece çıkış parametresi imleç yer tutucusu olabilir. Tablo değeri veri türü, yordamın OUTPUT parametresi olarak belirtilemiyor.

SALT OKUNUR

Parametresinin yordamın gövdesi içinde güncelleştirileebileceğini veya değiştirileebileceğini gösterir. Parametre türü bir tablo-değer türüyse READONLY belirtilmelidir.

RECOMPILE

Veritabanı Altyapısı'nın bu yordam için bir sorgu planını önbelleğe almadığını ve her yürütülürken derlenecek şekilde zorlamadığını gösterir. Yeniden derlemeyi zorlama nedenleri hakkında daha fazla bilgi için bkz. Saklı Yordamı Yeniden Derleme. BU seçenek, FOR REPLICATION belirtildiğinde veya CLR yordamları için kullanılamaz.

Veritabanı Altyapısı'na bir yordam içindeki tek tek sorgular için sorgu planlarını atmasını bildirmek için, sorgu tanımında RECOMPILE sorgu ipucunu kullanın. Daha fazla bilgi için bkz . Sorgu İpuçları (Transact-SQL).

ŞİFRELEME

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

SQL Server'ın CREATE PROCEDURE deyiminin özgün metnini karartılmış biçime dönüştürdüğünü gösterir. Gizlemenin çıkışı SQL Server'daki katalog görünümlerinden hiçbirinde doğrudan görünmez. Sistem tablolarına veya veritabanı dosyalarına erişimi olmayan kullanıcılar, karartılmış metni alamaz. Ancak metin, DAC bağlantı noktası üzerinden sistem tablolarına erişebilen veya veritabanı dosyalarına doğrudan erişebilen ayrıcalıklı kullanıcılar tarafından kullanılabilir. Ayrıca, sunucu işlemine hata ayıklayıcı ekleyebilen kullanıcılar, şifresi çözülen yordamı çalışma zamanında bellekten alabilir. Sistem meta verilerine erişme hakkında daha fazla bilgi için bkz. Meta Veri Görünürlüğü Yapılandırması.

Bu seçenek CLR yordamları için geçerli değildir.

Bu seçenekle oluşturulan yordamlar SQL Server çoğaltmasının bir parçası olarak yayımlanamaz.

EXECUTE AS yan tümcesi

Yordamın altında yürütülecek güvenlik bağlamını belirtir.

Yerel olarak derlenmiş saklı yordamlar için yan tümcesinde EXECUTE AS herhangi bir sınırlama yoktur. SQL Server 2014 (12.x) ve önceki sürümlerinde, SELF, OWNERve 'user_name' yan tümceleri yerel olarak derlenmiş saklı yordamlarla desteklenir.

Daha fazla bilgi için bkz . EXECUTE AS Yan Tümcesi (Transact-SQL).

ÇOĞALTMA IÇIN

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Yordamın çoğaltma için oluşturulduğunu belirtir. Sonuç olarak, abone üzerinde yürütülemez. FOR REPLICATION seçeneğiyle oluşturulan bir yordam, yordam filtresi olarak kullanılır ve yalnızca çoğaltma sırasında yürütülür. FOR REPLICATION belirtilirse parametreler bildirilemiyor. FOR ÇOĞALTMA CLR yordamları için belirtilemiyor. FOR REPLICATION ile oluşturulan yordamlar için YENIDEN DERLE seçeneği yoksayılır.

Yordamın FOR REPLICATION ve içinde sys.objectssys.procedures nesne türü vardır.

{ [ BEGIN ] sql_statement [;] [ ... n ] [ END ] }

Yordamın gövdesini oluşturan bir veya daha fazla Transact-SQL deyimi. deyimlerini içine almak için isteğe bağlı BEGIN ve END anahtar sözcüklerini kullanabilirsiniz. Daha fazla bilgi için aşağıdaki En İyi Yöntemler, Genel Açıklamalar ve Sınırlamalar ve Kısıtlamalar bölümlerine bakın.

DıŞ AD assembly_name. class_name. method_name

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Başvuruda bulunulacak CLR yordamı için .NET Framework derlemesinin yöntemini belirtir. class_name geçerli bir SQL Server tanımlayıcısı olmalı ve derlemede sınıf olarak bulunmalıdır. Sınıfın ad alanı bölümlerini ayırmak için nokta (.) kullanan ad alanı nitelenmiş bir adı varsa, sınıf adı köşeli ayraç () veya tırnak işareti ([]"") kullanılarak sınırlandırılmalıdır. Belirtilen yöntem, sınıfının statik bir yöntemi olmalıdır.

Varsayılan olarak, SQL Server CLR kodunu yürütemez. Ortak dil çalışma zamanı modüllerine başvuran veritabanı nesneleri oluşturabilir, değiştirebilir ve bırakabilirsiniz; ancak, clr etkin seçeneğini etkinleştirene kadar SQL Server'da bu başvuruları yürütemezsiniz. Seçeneği etkinleştirmek için sp_configure kullanın.

Uyarı

CLR yordamları, kapsanan bir veritabanında desteklenmez.

ILE ATOMIK

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Atomik saklı yordam yürütmeyi gösterir. Değişiklikler işlenir veya tüm değişiklikler bir özel durum oluşturarak geri alınır. Yerel olarak derlenmiş saklı yordamlar için ATOMIC WITH bloğu gereklidir.

YORDAM RETURNs (açıkça RETURN deyimi aracılığıyla veya örtük olarak yürütme tamamlayarak), yordam tarafından gerçekleştirilen iş işlenir. THROWs yordamı, yordam tarafından gerçekleştirilen iş geri alınır.

XACT_ABORT, atomik blok içinde varsayılan olarak ON'dır ve değiştirilemez. XACT_ABORT, Transact-SQL deyimi bir çalışma zamanı hatası döndürdiğinde SQL Server'ın geçerli işlemi otomatik olarak geri alıp almayacağını belirtir.

Aşağıdaki SET seçenekleri ATOMIC bloğunda her zaman ON'dır ve değiştirilemez.

  • CONCAT_NULL_YIELDS_NULL
  • QUOTED_IDENTIFIER, ARITHABORT
  • NOCOUNT
  • ANSI_NULLS
  • ANSI_WARNINGS

SET seçenekleri ATOMIC blokları içinde değiştirilemez. Kullanıcı oturumundaki SET seçenekleri yerel olarak derlenmiş saklı yordamlar kapsamında kullanılmaz. Bu seçenekler derleme zamanında düzeltilir.

BEGIN, ROLLBACK ve COMMIT işlemleri atomik blok içinde kullanılamaz.

Yerel olarak derlenmiş saklı yordam başına, yordamın dış kapsamında bir ATOMIK blok vardır. Bloklar iç içe yerleştirilemiyor. Atomik bloklar hakkında daha fazla bilgi için bkz. Yerel Olarak Derlenmiş Saklı Yordamlar.

NULL | NOT NULL

Bir parametrede null değerlere izin verilip verilmeyeceğini belirler. NULL varsayılan değerdir.

NATIVE_COMPILATION

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Yordamın yerel olarak derlendiğini gösterir. NATIVE_COMPILATION, SCHEMABINDING ve EXECUTE AS herhangi bir sırada belirtilebilir. Daha fazla bilgi için bkz. Yerel Olarak Derlenmiş Saklı Yordamlar.

SCHEMABINDING

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Bir yordam tarafından başvuruda bulunulan tabloların bırakılmamasını veya değiştirilememesini sağlar. SCHEMABINDING, yerel olarak derlenmiş saklı yordamlarda gereklidir. (Daha fazla bilgi için bkz . Yerel Olarak Derlenmiş Saklı Yordamlar.) SCHEMABINDING kısıtlamaları, kullanıcı tanımlı işlevlerle aynıdır. Daha fazla bilgi için CREATE FUNCTION (Transact-SQL) içindeki SCHEMABINDING bölümüne bakın.

DIL = [N] 'dil'

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

SET LANGUAGE (Transact-SQL) oturum seçeneğine eşdeğerdir. LANGUAGE = [N] 'language' gereklidir.

İŞLEM YALıTıM DÜZEYI

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Yerel olarak derlenmiş saklı yordamlar için gereklidir. Saklı yordam için işlem yalıtım düzeyini belirtir. Seçenekler şunlardır:

Bu seçenekler hakkında daha fazla bilgi için bkz. SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

YINELENEBILIR OKUMA

Deyimlerin değiştirilmiş ancak henüz diğer işlemler tarafından işlenmeyen verileri okuyamadığını belirtir. Başka bir işlem geçerli işlem tarafından okunan verileri değiştirirse, geçerli işlem başarısız olur.

SERİLEŞTİRİLEBİLİR

Aşağıdakileri belirtir:

  • Deyimler değiştirilmiş ancak diğer işlemler tarafından henüz işlenmemiş verileri okuyamaz.
  • Başka bir işlem geçerli işlem tarafından okunan verileri değiştirirse, geçerli işlem başarısız olur.
  • Başka bir işlem, geçerli işlemdeki deyimler tarafından okunan anahtar aralığına düşecek anahtar değerlerine sahip yeni satırlar eklerse, geçerli işlem başarısız olur.

AN -LIK GÖRÜNTÜ

Bir işlemdeki herhangi bir deyim tarafından okunan verilerin, işlemin başlangıcında var olan verilerin işlem açısından tutarlı sürümü olduğunu belirtir.

DATEFIRST = sayı

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Haftanın ilk gününü 1 ile 7 arasında bir sayıya belirtir. DATEFIRST isteğe bağlıdır. Belirtilmezse, ayar belirtilen dilden çıkarılır.

Daha fazla bilgi için bkz . SET DATEFIRST (Transact-SQL).

DATEFORMAT = format

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

Tarih, smalldatetime, datetime, datetime2 ve datetimeoffset karakter dizelerini yorumlamak için ay, gün ve yıl tarihi bölümlerinin sırasını belirtir. DATEFORMAT isteğe bağlıdır. Belirtilmezse, ayar belirtilen dilden çıkarılır.

Daha fazla bilgi için bkz. SET DATEFORMAT (Transact-SQL).

DELAYED_DURABILITY = { KAPALI | ON }

Şunlara uygulanır: SQL Server 2014 (12.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

SQL Server işlem işlemeleri tamamen dayanıklı, varsayılan veya gecikmeli dayanıklı olabilir.

Daha fazla bilgi için bkz . İşlem Dayanıklılığını Denetleme.

Basit örnekler

Başlamanıza yardımcı olmak için iki hızlı örnek verilmiştir: SELECT DB_NAME() AS ThisDB; geçerli veritabanının adını döndürür. Bu deyimi saklı bir yordamda sarmalayabilirsiniz, örneğin:

CREATE PROC What_DB_is_this
AS
SELECT DB_NAME() AS ThisDB;

deyimiyle store yordamını çağırın: EXEC What_DB_is_this;

Biraz daha karmaşık olan, yordamı daha esnek hale getirmek için bir giriş parametresi sağlamaktır. Örneğin:

CREATE PROC What_DB_is_that @ID INT
AS
SELECT DB_NAME(@ID) AS ThatDB;

Yordamı çağırırken bir veritabanı kimlik numarası girin. Örneğin, EXEC What_DB_is_that 2;tempdbdöndürür.

Daha fazla örnek için bu makalenin sonuna doğru örnekler bölümüne bakın.

En iyi yöntemler

Bu en iyi yöntemlerin kapsamlı bir listesi olmasa da, bu öneriler yordam performansını artırabilir.

  • SET NOCOUNT ON deyimini yordamın gövdesindeki ilk deyim olarak kullanın. Yani, AS anahtar sözcüğünden hemen sonra yerleştirin. Bu, SELECT, INSERT, UPDATE, MERGE ve DELETE deyimleri yürütüldükten sonra SQL Server'ın istemciye geri gönderdiği iletileri kapatır. Bu, netlik için oluşturulan çıkışı en düşük düzeyde tutar. Ancak günümüzün donanımında ölçülebilir bir performans avantajı yoktur. Daha fazla bilgi için bkz. SET NOCOUNT (Transact-SQL).
  • Yordamda veritabanı nesneleri oluştururken veya başvururken şema adlarını kullanın. Veritabanı Altyapısı'nın birden çok şemada arama yapmak zorunda değilse nesne adlarını çözümlemesi daha kısa sürer. Ayrıca, şema belirtilmeden nesneler oluşturulduğunda kullanıcının varsayılan şemasının atanmasından kaynaklanan izin ve erişim sorunlarını önler.
  • WHERE ve JOIN yan tümcelerinde belirtilen sütunların çevresinde işlevleri kaydırmaktan kaçının. Bunun yapılması sütunları belirleyici yapmaz ve sorgu işlemcisinin dizinleri kullanmasını engeller.
  • Çok sayıda veri satırı döndüren SELECT deyimlerinde skaler işlevleri kullanmaktan kaçının. Skaler işlevi her satıra uygulanması gerektiğinden, sonuçta elde edilen davranış satır tabanlı işlemeye benzer ve performansı düşürür.
  • kullanmaktan SELECT *kaçının. Bunun yerine gerekli sütun adlarını belirtin. Bu, yordam yürütmeyi durduran bazı Veritabanı Altyapısı hatalarını engelleyebilir. Örneğin, 12 sütunlu bir SELECT * tablodan veri döndüren ve sonra bu verileri 12 sütunlu geçici tabloya ekleyen bir deyim, her iki tablodaki sütunların sayısı veya sırası değiştirilene kadar başarılı olur.
  • Çok fazla veri işlemekten veya döndürmekten kaçının. Yordam kodunda sonuçları olabildiğince erken daraltın; böylece yordam tarafından gerçekleştirilen sonraki işlemler mümkün olan en küçük veri kümesi kullanılarak yapılır. yalnızca temel verileri istemci uygulamasına gönderin. Ağ üzerinden ek veri göndermekten ve istemci uygulamasını gereksiz büyük sonuç kümelerinden çalışmaya zorlamaktan daha verimlidir.
  • BEGIN/COMMIT TRANSACTION kullanarak açık işlemleri kullanın ve işlemleri olabildiğince kısa tutun. Daha uzun işlemler, daha uzun kayıt kilitleme ve kilitlenme olasılığının daha yüksek olduğu anlamına gelir.
  • Transact-SQL TRY kullanın... Bir yordam içinde hata işleme için CATCH özelliği. DENEMEK... CATCH, Transact-SQL deyimleri bloğunun tamamını kapsülleyebilir. Bu yalnızca daha az performans yükü oluşturmanın yanında, önemli ölçüde daha az programlamayla hata raporlamayı daha doğru hale getirir.
  • YORDAMın gövdesinde CREATE TABLE veya ALTER TABLE Transact-SQL deyimleri tarafından başvurulan tüm tablo sütunlarında DEFAULT anahtar sözcüğünü kullanın. Bu, null değerlere izin vermeyen sütunlara NULL geçirmeyi engeller.
  • Geçici tablodaki her sütun için NULL veya NOT NULL kullanın. ANSI_DFLT_ON ve ANSI_DFLT_OFF seçenekleri, create TABLE veya ALTER TABLE deyiminde bu öznitelikler belirtilmediğinde Veritabanı Altyapısı'nın sütunlara NULL veya NOT NULL özniteliklerini atama şeklini denetler. Bir bağlantı, bu seçenekler için yordamı oluşturan bağlantıdan farklı ayarlara sahip bir yordam yürütürse, ikinci bağlantı için oluşturulan tablonun sütunları farklı null atanabilirliğe sahip olabilir ve farklı davranışlar sergileyebilir. Her sütun için NULL veya NOT NULL açıkça belirtilirse, geçici tablolar yordamı yürüten tüm bağlantılar için aynı null atanabilirlik kullanılarak oluşturulur.
  • Null değerleri dönüştüren ve sorgulardan null değer içeren satırları ortadan kaldıran mantık içeren değişiklik deyimlerini kullanın. Transact-SQL'de NULL değerinin boş veya "hiçbir şey" değeri olmadığını unutmayın. Bilinmeyen bir değer için yer tutucudur ve özellikle sonuç kümelerini sorgularken veya TOPLAMA işlevlerini kullanırken beklenmeyen davranışlara neden olabilir.
  • Benzersiz değerler için belirli bir gereksinim olmadığı sürece UNION veya OR işleçleri yerine UNION ALL işlecini kullanın. Yinelemeler sonuç kümesinin dışına filtrelenmediğinden UNION ALL işleci daha az işlem yükü gerektirir.

Açıklamalar

Bir yordamın önceden tanımlanmış en büyük boyutu yoktur.

Yordamda belirtilen değişkenler kullanıcı tanımlı veya @@SPID gibi sistem değişkenleri olabilir.

Bir yordam ilk kez yürütülürken, verileri almak için en uygun erişim planını belirlemek üzere derlenmiş olur. Yordamın sonraki yürütmeleri, veritabanı altyapısının plan önbelleğinde kalmaya devam ederse önceden oluşturulmuş planı yeniden kullanabilir.

SQL Server başlatıldığında bir veya daha fazla yordam otomatik olarak yürütülebilir. Yordamların veritabanında sistem yöneticisi master tarafından oluşturulması ve arka plan işlemi olarak sysadmin sabit sunucu rolü altında yürütülmesi gerekir. Yordamlarda herhangi bir giriş veya çıkış parametresi olamaz. Daha fazla bilgi için bkz. Saklı Yordam Yürütme.

Yordamlar, bir yordam başka bir yordam çağırdığında veya bir CLR yordamına, türüne veya toplama işlemine başvurarak yönetilen kodu yürüttüğünde iç içe yerleştirilmiştir. Yordamlar ve yönetilen kod başvuruları en fazla 32 düzey iç içe yerleştirilebilir. Çağrılan yordam veya yönetilen kod başvurusu yürütmeye başladığında iç içe geçme düzeyi bir artar ve çağrılan yordam veya yönetilen kod başvurusu yürütmeyi tamamladığında bir azalır. Yönetilen kodun içinden çağrılan yöntemler iç içe geçme düzeyi sınırına karşı sayılmaz. Ancak, BIR CLR saklı yordamı SQL Server yönetilen sağlayıcısı aracılığıyla veri erişim işlemleri gerçekleştirdiğinde, yönetilen koddan SQL'e geçişe ek bir iç içe geçme düzeyi eklenir.

en yüksek iç içe yerleştirme düzeyini aşmaya çalışmak, çağrı zincirinin tamamının başarısız olmasına neden olur. geçerli saklı yordam yürütmesinin iç içe yerleştirme düzeyini döndürmek için @@NESTLEVEL işlevini kullanabilirsiniz.

Birlikte çalışabilirlik

Veritabanı Altyapısı, bir Transact-SQL yordamı oluşturulduğunda veya değiştirildiğinde hem SET QUOTED_IDENTIFIER hem de SET ANSI_NULLS ayarlarını kaydeder. Bu özgün ayarlar, yordam yürütülürken kullanılır. Bu nedenle, yordam çalışırken SET QUOTED_IDENTIFIER ve SET ANSI_NULLS için tüm istemci oturum ayarları yoksayılır.

SET ARITHABORT, SET ANSI_WARNINGS veya SET ANSI_PADDINGS gibi diğer SET seçenekleri, bir yordam oluşturulduğunda veya değiştirildiğinde kaydedilmez. Yordamın mantığı belirli bir ayara bağlıysa, uygun ayarı garanti etmek için yordamın başlangıcına bir SET deyimi ekleyin. Set deyimi bir yordamdan yürütülürse, ayar yalnızca yordam çalışması bitene kadar etkin kalır. Daha sonra ayar, çağrıldığında yordamın sahip olduğu değere geri yüklenir. Bu, tek tek istemcilerin yordamın mantığını etkilemeden istedikleri seçenekleri ayarlamasına olanak tanır.

SET SHOWPLAN_TEXT ve SET SHOWPLAN_ALL dışında herhangi bir SET deyimi bir yordam içinde belirtilebilir. Toplu iş içindeki tek deyimler bunlar olmalıdır. Seçilen SET seçeneği, yordamın yürütülmesi sırasında etkin kalır ve ardından eski ayarına geri döner.

Uyarı

SET ANSI_WARNINGS, bir yordamda, kullanıcı tanımlı işlevde parametreleri geçirirken veya bir batch deyiminde değişkenleri bildirirken ve ayarlarken dikkate alınmaz. Örneğin, bir değişken char(3) olarak tanımlanırsa ve üç karakterden büyük bir değere ayarlanırsa, veriler tanımlanan boyuta yuvarlanır ve INSERT veya UPDATE deyimi başarılı olur.

Sınırlamalar ve kısıtlamalar

CREATE PROCEDURE deyimi tek bir toplu işte diğer Transact-SQL deyimleriyle birleştirilemiyor.

Aşağıdaki deyimler saklı yordamın gövdesinde hiçbir yerde kullanılamaz.

CREATE SET USE
TOPLAMA OLUŞTURMA SET SHOWPLAN_TEXT KULLANIN database_name
VARSAYıLAN OLUŞTUR SET SHOWPLAN_XML
KURAL OLUŞTUR AYRıŞTıRMA OLARAK AYARLA
ŞEMA OLUŞTURMA SET SHOWPLAN_ALL
CREATE veya ALTER TRIGGER
CREATE veya ALTER FUNCTION
CREATE veya ALTER YORDAMı
CREATE veya ALTER VIEW

Bir yordam henüz var olmayan tablolara başvurabilir. Oluşturma zamanında yalnızca söz dizimi denetimi gerçekleştirilir. Yordam ilk kez yürütülene kadar derlenmemiştir. Yalnızca derleme sırasında, yordamda başvuruda bulunan tüm nesneler çözümlenir. Bu nedenle, var olmayan tablolara başvuran söz dizimsel olarak doğru bir yordam başarıyla oluşturulabilir; ancak, başvuruda bulunulan tablolar yoksa yordam yürütme zamanında başarısız olur.

İşlev adını parametre varsayılan değeri olarak veya bir yordam yürütürken parametreye geçirilen değer olarak belirtemezsiniz. Ancak, aşağıdaki örnekte gösterildiği gibi bir işlevi değişken olarak geçirebilirsiniz.

-- Passing the function value as a variable.
DECLARE @CheckDate DATETIME = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

Yordam SQL Server'ın uzak bir örneğinde değişiklik yaparsa, değişiklikler geri alınamaz. Uzak yordamlar işlemlerde yer almaz.

Veritabanı Altyapısı'nın .NET Framework'te aşırı yüklendiğinde doğru yönteme başvurması için EXTERNAL NAME yan tümcesinde belirtilen yöntemin aşağıdaki özelliklere sahip olması gerekir:

  • Statik yöntem olarak bildirilmelidir.
  • Yordamın parametre sayısıyla aynı sayıda parametre alın.
  • SQL Server yordamının ilgili parametrelerinin veri türleriyle uyumlu parametre türlerini kullanın. SQL Server veri türlerini .NET Framework veri türleriyle eşleştirme hakkında bilgi için bkz. CLR Parametre Verilerini Eşleme.

Meta veriler

Aşağıdaki tabloda, saklı yordamlar hakkında bilgi döndürmek için kullanabileceğiniz katalog görünümleri ve dinamik yönetim görünümleri listelenmektedir.

View Description
sys.sql_modules Transact-SQL yordamının tanımını döndürür. ŞIFRELEME seçeneğiyle oluşturulan yordamın metni katalog görünümü kullanılarak sys.sql_modules görüntülenemez.
sys.assembly_modules CLR yordamı hakkındaki bilgileri döndürür.
sys.parameters Bir yordamda tanımlanan parametreler hakkında bilgi döndürür
sys.sql_expression_dependenciessys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities Bir yordam tarafından başvuruda bulunan nesneleri döndürür.

Derlenmiş yordamın boyutunu tahmin etmek için aşağıdaki Performans İzleyicisi Sayaçlarını kullanın.

Performans İzleyicisi nesne adı Performans İzleyicisi Sayacı adı
SQLServer: Önbellek Nesnesini Planlama Önbellek İsabet Oranı
Sayfaları Önbelleğe Al
Önbellek Nesnesi Sayısı 1

1 Bu sayaçlar geçici Transact-SQL, hazırlanmış Transact-SQL, yordamlar, tetikleyiciler vb. gibi çeşitli önbellek nesneleri kategorileri için kullanılabilir. Daha fazla bilgi için bkz. SQL Server, Önbellek Nesnesini Planlama.

Permissions

CREATE PROCEDURE Veritabanında izin ve ALTER yordamın oluşturulduğu şema üzerinde izin gerektirir veya sabit db_ddladmin veritabanı rolünde üyelik gerektirir.

CLR saklı yordamları için EXTERNAL NAME yan tümcesinde başvurulan derlemenin sahipliğini veya REFERENCES bu derleme üzerinde izni gerektirir.

CREATE PROCEDURE ve bellek için iyileştirilmiş tablolar

Bellek için iyileştirilmiş tablolara hem geleneksel hem de yerel olarak derlenmiş saklı yordamlar aracılığıyla erişilebilir. Yerel yordamlar çoğu durumda daha verimli bir yöntemdir. Daha fazla bilgi için bkz. Yerel Olarak Derlenmiş Saklı Yordamlar.

Aşağıdaki örnek, bellek için iyileştirilmiş bir tabloya dbo.Departmentserişen yerel olarak derlenmiş bir saklı yordamın nasıl oluşturulacağını gösterir:

CREATE PROCEDURE dbo.usp_add_kitchen @dept_id INT, @kitchen_count INT NOT NULL
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')

UPDATE dbo.Departments
SET kitchen_count = ISNULL(kitchen_count, 0) + @kitchen_count
WHERE ID = @dept_id
END;
GO

NATIVE_COMPILATION olmadan oluşturulan bir yordam, yerel olarak derlenmiş bir saklı yordamla değiştirilemez.

Yerel olarak derlenmiş saklı yordamlarda programlanabilirlik, desteklenen sorgu yüzeyi alanı ve işleçler için bkz. Yerel Olarak Derlenmiş T-SQL Modülleri için Desteklenen Özellikler.

Örnekler

Kategori Öne çıkan söz dizimi öğeleri
Temel Söz Dizimi İŞLEM OLUŞTUR
Parametreleri geçirme @parameter
  • = varsayılan
  • ÇIKTI
  • tablo değerli parametre türü
  • DEĞIŞEN IMLEÇ
Saklı yordam kullanarak verileri değiştirme Güncelleme
Hata İşleme TRY...CATCH
Yordam tanımını gizleme ŞIFRELEME ILE
Yordamı Yeniden Derlemeye Zorlama YENIDEN DERLEME ILE
Güvenlik Bağlamını Ayarlama OLARAK ÇALIŞTIR

Temel söz dizimi

Bu bölümdeki örnekler, gerekli en düşük söz dizimini kullanarak CREATE PROCEDURE deyiminin temel işlevselliğini gösterir.

A. Transact-SQL yordamı oluşturma

Aşağıdaki örnek, AdventureWorks2025 veritabanındaki bir görünümden tüm çalışanları (sunulan isim ve soyadları), iş unvanlarını ve departman adlarını döndüren bir kayıtlı prosedür oluşturur. Bu yordam herhangi bir parametre kullanmaz. Örnek daha sonra yordamı yürütmenin üç yöntemini gösterir.

CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SET NOCOUNT ON;
    SELECT LastName, FirstName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment;
GO

SELECT * FROM HumanResources.vEmployeeDepartment;

Yordam uspGetEmployees aşağıdaki yollarla yürütülebilir:

EXECUTE HumanResources.uspGetAllEmployees;
GO
-- Or
EXEC HumanResources.uspGetAllEmployees;
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetAllEmployees;

B. Birden fazla sonuç kümesi döndürme

Aşağıdaki yordam iki sonuç kümesi döndürür.

CREATE PROCEDURE dbo.uspMultipleResults
AS
SELECT TOP(10) BusinessEntityID, Lastname, FirstName FROM Person.Person;
SELECT TOP(10) CustomerID, AccountNumber FROM Sales.Customer;
GO

C. CLR saklı yordamı oluşturma

Aşağıdaki örnek, derlemedeki GetPhotoFromDB sınıfın GetPhotoFromDB yöntemine LargeObjectBinaryHandlingLOBUsingCLR başvuran yordamı oluşturur. Yordam oluşturulmadan önce derleme HandlingLOBUsingCLR yerel veritabanına kaydedilir. Örnekte , assembly_bits'den oluşturulan bir derleme varsayılır.

Şunları uygular: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı, assembly_bits'dan oluşturulan bir montaj kullanıldığında.

CREATE ASSEMBLY HandlingLOBUsingCLR
FROM '\\MachineName\HandlingLOBUsingCLR\bin\Debug\HandlingLOBUsingCLR.dll';
GO
CREATE PROCEDURE dbo.GetPhotoFromDB
(
    @ProductPhotoID INT
    , @CurrentDirectory NVARCHAR(1024)
    , @FileName NVARCHAR(1024)
)
AS EXTERNAL NAME HandlingLOBUsingCLR.LargeObjectBinary.GetPhotoFromDB;
GO

Parametreleri geçirme

Bu bölümdeki örneklerde, bir saklı yordama ve saklı yordamdan değerleri geçirmek için giriş ve çıkış parametrelerinin nasıl kullanılacağı gösterilmektedir.

D. Giriş parametreleriyle yordam oluşturma

Aşağıdaki örnek, çalışanın adı ve soyadı değerlerini geçirerek belirli bir çalışanın bilgilerini döndüren bir saklı yordam oluşturur. Bu yordam yalnızca geçirilen parametreler için tam eşleşmeleri kabul eder.

IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees
    @LastName NVARCHAR(50),
    @FirstName NVARCHAR(50)
AS

    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName = @FirstName AND LastName = @LastName;
GO

Yordam uspGetEmployees aşağıdaki yollarla yürütülebilir:

EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman';
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetEmployees N'Ackerman', N'Pilar';

E. Joker karakter parametreleriyle bir yordam kullanma

Aşağıdaki örnek, çalışanın adı ve soyadı için tam veya kısmi değerler geçirerek çalışanların bilgilerini döndüren bir saklı yordam oluşturur. Bu yordam düzeni, geçirilen parametrelerle eşleşir veya sağlanmazsa, önceden ayarlanmış varsayılanı (harfle Dbaşlayan soyadları) kullanır.

IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees2;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees2
    @LastName NVARCHAR(50) = N'D%',
    @FirstName NVARCHAR(50) = N'%'
AS
    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;

Yordam uspGetEmployees2 birçok birleşimde yürütülebilir. Burada yalnızca birkaç olası bileşim gösterilir.

EXECUTE HumanResources.uspGetEmployees2;
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Wi%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 @FirstName = N'%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'H%', N'S%';

F. OUTPUT parametrelerini kullanma

Aşağıdaki örnek yordamı oluşturur uspGetList . Bu yordam, belirtilen tutarı aşmamış fiyatları olan ürünlerin listesini döndürür. Örnekte birden çok deyimin ve birden çok SELECTOUTPUT parametrenin kullanılması gösterilmektedir. OUTPUT parametreleri, yordam yürütme sırasında ayarlanan bir değere erişmek için bir dış yordamı, toplu işlemi veya birden fazla Transact-SQL deyimini etkinleştirir.

IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
    DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product VARCHAR(40)
    , @MaxPrice MONEY
    , @ComparePrice MONEY OUTPUT
    , @ListPrice MONEY OUT
AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

değerinden daha düşük uspGetListmaliyetli Adventure Works ürünlerinin (Bikes) listesini döndürmek için yürütür$700. ve parametreleri, OUTPUT@Cost@ComparePrices penceresinde bir ileti döndürmek için akış denetimi diliyle birlikte kullanılır.

Uyarı

OUTPUT değişkeni, yordam oluşturulduğunda ve değişken kullanıldığında tanımlanmalıdır. Parametre adı ve değişken adının eşleşmesi gerekmez; ancak @ListPrice kullanılmadığı sürece = veri türü ve parametre konumlandırma eşleşmelidir.

DECLARE @ComparePrice MONEY, @Cost MONEY;
EXECUTE Production.uspGetList '%Bikes%', 700,
    @ComparePrice OUT,
    @Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
    PRINT 'These products can be purchased for less than
    $'+RTRIM(CAST(@ComparePrice AS VARCHAR(20)))+'.'
END
ELSE
    PRINT 'The prices for all products in this category exceed
    $'+ RTRIM(CAST(@ComparePrice AS VARCHAR(20)))+'.';

Kısmi sonuç kümesi aşağıdadır:

Product                     List Price
--------------------------  ----------
Road-750 Black, 58          539.99
Mountain-500 Silver, 40     564.99
Mountain-500 Silver, 42     564.99
...
Road-750 Black, 48          539.99
Road-750 Black, 52          539.99

(14 row(s) affected)

These items can be purchased for less than $700.00.

G. Tablo değerli parametre kullanma

Aşağıdaki örnek, tabloya birden çok satır eklemek için tablo değerli parametre türünü kullanır. Örnek parametre türünü oluşturur, buna başvurmak için bir tablo değişkeni bildirir, parametre listesini doldurur ve ardından değerleri saklı yordama geçirir. Saklı yordam, değerleri kullanarak tabloya birden çok satır ekler.

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2022].[Production].[Location]
       ([Name]
       , [CostRate]
       , [Availability]
       , [ModifiedDate])
    SELECT *, 0, GETDATE()
    FROM @TVP;
GO

/* Declare a variable that references the type. */
DECLARE @LocationTVP
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM
    [AdventureWorks2022].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
H. OUTPUT imleç parametresi kullanma

Aşağıdaki örnek, bir yordama yerel olan bir imleci çağıran toplu işleme, yordama veya tetikleyiciye geçirmek için OUTPUT imleç parametresini kullanır.

İlk olarak, bildiren yordamı oluşturun ve ardından tabloda bir imleç Currency açın:

CREATE PROCEDURE dbo.uspCurrencyCursor
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO

Ardından, yerel bir imleç değişkeni bildiren, imleci yerel değişkene atama yordamını yürüten ve ardından satırları imleçten getiren bir toplu iş çalıştırın.

DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
    FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO

Saklı yordam kullanarak verileri değiştirme

Bu bölümdeki örneklerde, yordamın tanımına veri işleme dili (DML) deyimi ekleyerek tablo veya görünümlere veri ekleme veya değiştirme işlemleri gösterilmektedir.

I. Saklı yordamda UPDATE kullanma

Aşağıdaki örnek, saklı yordamda UPDATE deyimini kullanır. Yordam bir giriş parametresi ve @NewHours bir çıkış parametresi @RowCountalır. @NewHours parametre değeri, tablosundaki VacationHourssütunu HumanResources.Employee güncelleştirmek için UPDATE deyiminde kullanılır. Çıkış @RowCount parametresi, bir yerel değişkene etkilenen satır sayısını döndürmek için kullanılır. SET yan tümcesinde bir CASE ifadesi, için ayarlanan değeri koşullu olarak belirlemek için VacationHourskullanılır. Çalışana saatlik ödeme yapıldığında (SalariedFlag = 0), VacationHours geçerli saat sayısına ve içinde @NewHoursbelirtilen değere ayarlanır; aksi takdirde, VacationHours içinde @NewHoursbelirtilen değere ayarlanır.

CREATE PROCEDURE HumanResources.Update_VacationHours
@NewHours SMALLINT, @Rowcount INT OUTPUT
AS
SET NOCOUNT ON;
UPDATE HumanResources.Employee
SET VacationHours =
    ( CASE
        WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
        ELSE @NewHours
        END
    )
WHERE CurrentFlag = 1;
SET @Rowcount = @@rowcount;

GO
DECLARE @Rowcount INT
EXEC HumanResources.Update_VacationHours 40, @Rowcount OUTPUT
PRINT @Rowcount;

Hata yönetimi

Bu bölümdeki örnekler saklı yordam yürütürken oluşabilecek hataları işleme yöntemlerini gösterir.

J. TRY kullan... TUTMAK

AŞAĞıDAKI örnekte TRY... Saklı yordamın yürütülmesi sırasında yakalanan hata bilgilerini döndürmek için CATCH yapısı.

CREATE PROCEDURE Production.uspDeleteWorkOrder ( @WorkOrderID INT )
AS
SET NOCOUNT ON;
BEGIN TRY
  BEGIN TRANSACTION
  -- Delete rows from the child table, WorkOrderRouting, for the specified work order.
    DELETE FROM Production.WorkOrderRouting
    WHERE WorkOrderID = @WorkOrderID;
  -- Delete the rows from the parent table, WorkOrder, for the specified work order.
    DELETE FROM Production.WorkOrder
    WHERE WorkOrderID = @WorkOrderID;
  COMMIT
END TRY

BEGIN CATCH
  -- Determine if an error occurred.
  IF @@TRANCOUNT > 0
    ROLLBACK

  -- Return the error information.
  DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT;
  SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY();
  RAISERROR(@ErrorMessage, @ErrorSeverity, 1);
END CATCH;

GO
EXEC Production.uspDeleteWorkOrder 13;
GO
/* Intentionally generate an error by reversing the order in which rows
   are deleted from the parent and child tables. This change does not
   cause an error when the procedure definition is altered, but produces
   an error when the procedure is executed.
*/
ALTER PROCEDURE Production.uspDeleteWorkOrder ( @WorkOrderID INT )
AS

BEGIN TRY
  BEGIN TRANSACTION
  -- Delete the rows from the parent table, WorkOrder, for the specified work order.
    DELETE FROM Production.WorkOrder
    WHERE WorkOrderID = @WorkOrderID;

  -- Delete rows from the child table, WorkOrderRouting, for the specified work order.
    DELETE FROM Production.WorkOrderRouting
    WHERE WorkOrderID = @WorkOrderID;
  COMMIT TRANSACTION
END TRY

BEGIN CATCH
  -- Determine if an error occurred.
  IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION

  -- Return the error information.
  DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT;
  SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY();
  RAISERROR(@ErrorMessage, @ErrorSeverity, 1);
END CATCH;
GO
-- Execute the altered procedure.
EXEC Production.uspDeleteWorkOrder 15;
GO
DROP PROCEDURE Production.uspDeleteWorkOrder;

Yordam tanımını karart

Bu bölümdeki örnekler saklı yordamın tanımının nasıl gizleneceğini gösterir.

K. ŞIFRELEME ile seçeneğini kullanma

Aşağıdaki örnek yordamı oluşturur HumanResources.uspEncryptThis .

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler, Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.

CREATE PROCEDURE HumanResources.uspEncryptThis
WITH ENCRYPTION
AS
    SET NOCOUNT ON;
    SELECT BusinessEntityID, JobTitle, NationalIDNumber,
        VacationHours, SickLeaveHours
    FROM HumanResources.Employee;
GO

seçeneği, WITH ENCRYPTION aşağıdaki örneklerde gösterildiği gibi sistem kataloğunu sorgularken veya meta veri işlevlerini kullanırken yordamın tanımını gizler.

komutunu çalıştırın sp_helptext:

EXEC sp_helptext 'HumanResources.uspEncryptThis';

Sonuç kümesi aşağıdadır.

The text for object 'HumanResources.uspEncryptThis' is encrypted.

Katalog görünümünü doğrudan sorgula sys.sql_modules :

SELECT definition FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.uspEncryptThis');

Sonuç kümesi aşağıdadır.

definition
--------------------------------
NULL

Uyarı

Sistem saklı yordamı sp_helptext Azure Synapse Analytics'te desteklenmez. Bunun yerine sys.sql_modules nesne kataloğu görünümünü kullanın.

Yordamı yeniden derlemeye zorlama

Bu bölümdeki örnekler, yordamı her yürütülürken yeniden derlemeye zorlamak için WITH RECOMPILE yan tümcesini kullanır.

L. WITH RECOMPILE seçeneğini kullanma

WITH RECOMPILE yan tümcesi, yordama sağlanan parametreler tipik olmadığında ve yeni bir yürütme planının önbelleğe alınmaması veya bellekte depolanmaması gerektiğinde yararlıdır.

IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspProductByVendor;
GO
CREATE PROCEDURE dbo.uspProductByVendor @Name VARCHAR(30) = '%'
WITH RECOMPILE
AS
    SET NOCOUNT ON;
    SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'
    FROM Purchasing.Vendor AS v
    JOIN Purchasing.ProductVendor AS pv
      ON v.BusinessEntityID = pv.BusinessEntityID
    JOIN Production.Product AS p
      ON pv.ProductID = p.ProductID
    WHERE v.Name LIKE @Name;

Güvenlik bağlamını ayarlama

Bu bölümdeki örnekler, saklı yordamın yürütüldiği güvenlik bağlamını ayarlamak için EXECUTE AS yan tümcesini kullanır.

M. EXECUTE AS yan tümcesini kullanma

Aşağıdaki örnekte, bir yordamın yürütülebileceği güvenlik bağlamını belirtmek için EXECUTE AS yan tümcesinin kullanılması gösterilmektedir. Örnekte seçeneği, CALLER yordamın onu çağıran kullanıcı bağlamında yürütülebileceğini belirtir.

CREATE PROCEDURE Purchasing.uspVendorAllInfo
WITH EXECUTE AS CALLER
AS
    SET NOCOUNT ON;
    SELECT v.Name AS Vendor, p.Name AS 'Product name',
      v.CreditRating AS 'Rating',
      v.ActiveFlag AS Availability
    FROM Purchasing.Vendor v
    INNER JOIN Purchasing.ProductVendor pv
      ON v.BusinessEntityID = pv.BusinessEntityID
    INNER JOIN Production.Product p
      ON pv.ProductID = p.ProductID
    ORDER BY v.Name ASC;
GO

N. Özel izin kümeleri oluşturma

Aşağıdaki örnekte bir veritabanı işlemi için özel izinler oluşturmak üzere EXECUTE AS kullanılır. TRUNCATE TABLE gibi bazı işlemlerin verilebilir izinleri yoktur. TRUNCATE TABLE deyimini saklı yordama ekleyerek ve bu yordamın tabloyu değiştirme izinleri olan bir kullanıcı olarak yürütülmesini belirterek, tabloyu kesme izinlerini yordam üzerinde EXECUTE izinleri veren kullanıcıya genişletebilirsiniz.

CREATE PROCEDURE dbo.TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

O. SELECT deyimi çalıştıran saklı yordam oluşturma

Bu örnekte, yordam oluşturmaya ve çalıştırmaya yönelik temel söz dizimi gösterilmektedir. Bir toplu işlemi çalıştırırken CREATE PROCEDURE ilk deyim olmalıdır. Örneğin, AdventureWorksPDW2022'de aşağıdaki saklı yordamı oluşturmak için önce veritabanı bağlamını ayarlayın ve ardından CREATE PROCEDURE deyimini çalıştırın.

-- Uses AdventureWorksDW database

--Run CREATE PROCEDURE as the first statement in a batch.
CREATE PROCEDURE Get10TopResellers
AS
BEGIN
    SELECT TOP (10) r.ResellerName, r.AnnualSales
    FROM DimReseller AS r
    ORDER BY AnnualSales DESC, ResellerName ASC;
END
;
GO

--Show 10 Top Resellers
EXEC Get10TopResellers;

Ayrıca bakınız