procedure (Transact-sql) oluştur

Oluşturur bir Transact-SQLya da ortak dil çalışma zamanı (clr) depolanan yordamı içinde SQL Server 2012. Onlar için bu saklı yordamları prosedürleri diğer programlama dillerinde benzer:

  • Giriş parametrelerini kabul etmek ve birden çok değer arama yordamı veya toplu çıkış parametreleri formunda dönün.

  • Diğer yordamları çağıran dahil olmak üzere veritabanında işlemleri gerçekleştirmek programlama deyimleri içerir.

  • Arama yordamı veya toplu başarı veya başarısızlık (ve başarısızlık nedeni) belirtmek için bir durum değerini döndürür.

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

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

--Transact-SQL Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ VARYING ] [ = 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 Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ] 
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Bağımsız değişkenler

  • schema_name
    Yordamı ait olduğu şema adı. Şemaya bağlı işlemlerdir. Yordam oluşturulduğunda, şema adı belirtilmezse, yordamı oluşturarak kullanıcı varsayılan şema otomatik olarak atanır.

  • procedure_name
    Yordamın adı. Yordam adları için kuralları ile uymak gerekir tanımlayıcıları şema içinde benzersiz olmalıdır.

    Kaçının saklı önek adlandırma yordamları. Bu önek olarak kullanılan SQL Serversistem yordamları atamak. Önekini kullanarak uygulama kodu aynı ada sahip bir sistem yordamı ise kırmaya neden olabilir.

    Önce bir sayı işareti (#) kullanarak yerel veya genel geçici yordamları oluşturulabilir procedure_name(#procedure_name) yerel geçici yordamları ve genel geçici yordamları için iki numara işaretleri (##procedure_name). Yerel geçici yordam oluşturulduğu ve bu bağlantı kapalı olduğunda bırakılan bağlantı yalnızca görünür. Genel geçici yordam tüm bağlantıları mevcuttur ve yordamı kullanarak son oturumun sonunda bırakılır. Geçici isimler clr yordamları için belirtilemez.

    Bir yordam veya genel geçici yordam, tam adı dahil ##, 128 karakterden uzun olamaz. Tam adı dahil #, yerel geçici bir yordam için 116 karakteri aşamaz.

  • **;**number
    Grup yordamlar aynı adı için kullanılan isteğe bağlı bir tamsayı. Gruplandırılmış bu yordamları birlikte bir drop procedure deyimi kullanarak kesilmesini.

    [!NOT]

    Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

    Numaralandırılmış yordamları kullanamazsınız xml veya kullanıcı tanımlı clr türleri ve plan Kılavuzu içinde kullanılamaz.

  • @parameter
    Parametre yordamda bildirilen. Parametre adı kullanarak belirtmek işareti (
    @
    ) ilk karakteri olarak. Parametre adı kuralları uymanız gerekir tanımlayıcıları. Yerel yordam parametreleri; diğer yordamlarla aynı parametre adları kullanılır.

    Bir veya daha fazla parametre bildirilebilir; en fazla 2.100'dır. Yordam parametresi için varsayılan değer tanımlanır veya başka bir parametre eşit değer ayarlanır sürece çağrıldığında bildirilen her parametre değeri kullanıcı tarafından sağlanmalıdır. Bir yordamı varsa tablo değerli parametrelerive arama parametresi eksik, boş bir tablo içinde geçti. Parametre, yalnızca sabit ifadeler yer alabilir; Tablo adları, sütun adları veya diğer veritabanı nesnelerinin adlarını yerine kullanılamaz. Daha fazla bilgi için, bkz. execute (Transact-sql).

    Parametreleri olamaz for REPLICATION belirtilirse ilan etti.

  • [ type_schema_name**.** ] data_type
    Parametre ve veri türü ait olduğu şema veri türü.

    Guidelines for Transact-SQLyordam:

    • Tüm Transact-SQLveri türü parametreleri olarak kullanılabilir.

    • Kullanıcı tanımlı tablo türü tablo değerli parametreleri oluşturmak için kullanabilirsiniz. Tablo değerli parametreleri yalnızca giriş parametreleri olabilir ve readonly anahtar eşlik etmelidir. Daha fazla bilgi için bkz.Tablo Valued Parametreler (veritabanı altyapısı) kullanma

    • cursorveri türleri yalnızca çıkış parametreleri olabilir ve VARYING anahtar eşlik etmelidir.

    clr yordamları için yönergeleri:

    • Tüm yerli SQL Serververi türleri yönetilen kod eşdeğer parametreleri olarak kullanılabilir olan. clr türleri arasındaki ilişkiyi hakkında daha fazla bilgi ve SQL Serverbkz: sistem veri türleri, clr parametre verilerini eşleme. Hakkında daha fazla bilgi için SQL Serversistem veri türleri ve onların sözdizimini görmek Veri Türleri (Transact-SQL).

    • Tablo valued veya cursorveri türü parametre olarak kullanılamaz.

    • Parametre veri türü kullanıcı tanımlı bir clr türü ise, türü üzerinde execute izni olması gerekir.

  • DEĞİŞEN
    Sonuç kümesi bir çıkış parametresi olarak desteklenen belirtir. Bu parametre yordamı tarafından dinamik olarak oluşturulur ve içeriğini gösterebilir. Yalnızca için geçerlidir cursorparametreleri. Bu seçenek clr yordamları için geçerli değil.

  • default
    Bir parametre için varsayılan bir değer. Parametre varsayılan değeri tanımlanırsa, bu parametre için bir değer belirtmeden yordam yürütülebilecek. Varsayılan değer, sabit olmalıdır veya null olabilir. Sabit değeri parametre yordamı geçerken LIKE anahtar sözcüğünü kullanmak mümkün hale joker, şeklinde olabilir. c aşağıdaki örneğe bakın.

    Varsayılan değer olarak kaydedilip sys.parameters.default sütun clr yordamları için sadece. Bu sütun null olur Transact-SQLyordam parametreleri.

  • OUT | ÇIKIŞ
    Parametre bir çıktı parametresi gösterir. ÇIKIŞ parametreleri değerleri yordamı çağıran için kullanın.  text, ntext, ve imageparametreleri clr yordam yordam olmadığı sürece çıkış parametreleri kullanılamaz. clr yordam yordam değilse imleci yer tutucu, çıktı parametresi olabilir. Yordam output parametresi olarak bir tablo değer veri türü belirtilemez.

  • READONLY
    Parametre değil güncelleştirilmesi veya yordam gövdesinde güncellenmiştir olduğunu gösterir. Parametre türü tablo değer türü ise, salt okunur belirtilmelidir.

  • YENİDEN DERLE
    Gösteren Veritabanı Altyapısıher zaman o yürütüldüğünde derlenecek zorlayarak, bu yordam için bir sorgu planı önbelleğe almaz. Recompile zorlamak için nedenleri hakkında daha fazla bilgi için bkz: Saklı yordam yeniden derlemek. for REPLICATION belirtilirse veya clr yordamları için bu seçenek kullanılamaz.

    Talimat Veritabanı Altyapısıyordam içindeki bireysel sorgular sorgu planları atmak için sorgu tanımında RECOMPILE sorgu ipucu kullanın. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).

  • ENCRYPTION
    Gösteren SQL Servercreate procedure deyimi özgün metin obfuscated biçimine dönüştürecektir. Obfuscation çıktısını doğrudan herhangi bir katalog görünümlerinde görünür değil SQL Server. Sistem tabloları veya veritabanı dosyalarına erişimi olan kullanıcıların obfuscated metni alınamıyor. Ancak, metni erişebilen ya da sistem tabloları üzerinde ayrıcalıklı kullanıcılar için kullanılabilir olur dac bağlantı noktası ya da doğrudan veritabanı dosyalarına erişim. Ayrıca, kullanıcılar için sunucu işlemi bir hata ayıklayıcı ekleyebileceğini zamanında bellekten şifresi yordamı alabilirsiniz. Sistem meta veri erişim hakkında daha fazla bilgi için bkz: Meta veri görünürlük yapılandırma.

    Bu seçenek clr yordamları için geçerli değil.

    Bu seçeneği ile oluşturulan yordamlar bir parçası olarak yayınlanan SQL Serverçoğaltma.

  • EXECUTE AS
    Yordamı yürütmek güvenlik bağlamında belirtir.

    Daha fazla bilgi için, bkz. execute as yan tümcesi (Transact-sql).

  • ÇOĞALTMA İÇİN
    Yordam çoğaltma için oluşturulduğunu belirtir. Sonuç olarak, abone üzerinde yürütülemez. for REPLICATION seçeneğiyle oluşturulmuş bir yordam yordam filtre olarak kullanılır ve yalnızca çoğaltma sırasında yürütülür. Parametreleri olamaz for REPLICATION belirtilirse ilan etti. ÇOĞALTMA için clr yordamları için belirtilemez. RECOMPILE seçeneği ile çoğaltma için oluşturulan yordamlar için yoksayılır.

    for REPLICATION yordamı-ecek-si olmak bir nesne türü rf içinde sys.objects ve sys.procedures.

  • { [ BEGIN ] sql_statement [;] [ ...n ] [END]}
    Bir veya daha fazla Transact-SQLyordam gövdesinde oluşan tablolar. Deyimleri içine isteğe bağlı BEGIN ve end anahtar kelimeler kullanabilirsiniz. Bilgi için bkz: en iyi uygulamalar, genel açıklamalar ve sınırlamalar ve kısıtlamalar bölümlerde.

  • Dış ad assembly_name**.class_name.method_name
    Yöntemini belirtir bir .NET Frameworkbaşvurmak için Derleme clr yordam için. class_namegeçerli olmalıdır SQL Servertanımlayıcısı ve derleme bir sınıf olarak varolmalıdır. Sınıf bir süre kullandığı ad alanıyla nitelenmiş bir adı varsa (
    .) ad alanının bölümlerini ayırmak için sınıf adı köşeli ayraçlar kullanılarak ayrılmış gerekir ([]) veya tırnak işaretleri (""**).   Belirtilen yöntem sınıfının statik bir yöntem olmalıdır.

    Varsayılan olarak, SQL Serverclr kod yürütülemez. Oluşturmak, değiştirmek ve ortak dil Çalışma Zamanı Modülü başvuru veritabanı nesnelerini bırakın; Ancak, bu başvurular yürütülemiyor SQL Serverolanak kadar clr seçeneği etkin. Seçeneği etkinleştirmek için kullanın sp_configure.

    [!NOT]

    clr yordamları içerdiği bir veritabanında desteklenmez.

En İyi Yöntemler

Ancak bu yöntemler ayrıntılı bir liste değildir, bu önerileri yordam performansını artırabilir.

  • set nocount on deyimini yordamı gövdesi ilk deyimi kullanın. Yani, sadece as anahtar sözcüğü sonra yerleştirin. Bu döner kapalı iletileri, SQL Servergönderdiği geri istemciye sonra herhangi bir select, INSERT, update, birleştirme ve delete deyimlerini yürütülür. Genel veritabanı ve uygulama performansını bu gereksiz ağ yükünü ortadan kaldırarak artırıldı. Bilgi için set nocount (Transact-sql).

  • Oluştururken veya veritabanı nesnelerini yordamda başvuran şema adları kullanın. O-ecek almak-e daha az işlem süresi Veritabanı Altyapısıbirden çok şema aranacak yoksa nesne adları çözümlemek için. Ayrıca izin önlemek ve kullanıcı varsayılan şema nesneleri şema belirtmeden oluşturulduğunda atanan kaynaklanan erişim.

  • Fonksiyonları nerede belirtilen sütun etrafında kaydırma önlemek ve JOIN yan tümceleri. Bu sayede sütunlar deterministic olmayan yapar ve dizinleri kullanarak sorgu işlemci engeller.

  • Birçok veri satırları döndüren Seç deyimlerinde skalar işlev kullanmaktan kaçının. Skalar fonksiyon her satırına uygulanacak olması nedeniyle, elde edilen davranış, satır tabanlı işleme gibi ve performansı düşürür.

  • select kaçının *. Bunun yerine, gerekli sütun adlarını belirtin. Bu bazı engelleyebilir Veritabanı Altyapısıyordamı yürütme durdurma hataları. Örneğin, bir select * 12 sütunu tablodan veri döndüren ve bu verileri 12 sütun geçici tabloya ekler deyimi sayısı kadar başarılı olur veya her iki tablodaki sütunların sırası değiştirilir.

  • İşleme veya çok fazla veri döndürme kaçının. Sonuçları daraltmak yordam tarafından gerçekleştirilen herhangi bir sonraki işlemler yapılır yordamın kodu olabildiğince erken küçük verileri kullanarak olası ayarlayabilir, böylece. Temel verileri istemci uygulamasına göndermesine. Bu ek verileri ağ üzerinden gönderme ve gereksiz yere büyük boyutlu sonuç kümeleri ile çalışmak için istemci uygulaması zorlamadan daha etkilidir.

  • Açık hareketler başla/bitir hareketi kullanılması ve hareketleri olabildiğince kısa tutun. Uzun işlemler deadlocking için uzun kayıt kilitleme ve büyük bir potansiyel anlamına gelir.

  • Kullanım Transact-SQLtry…İçinde bir yordam hata yakalama özelliğini. TRY…YAKALAMAK kapsülleyen bir bloğunun tamamını Transact-SQLdeyimleri. Bu sadece daha az performans yükü oluşturur, ayrıca hata raporlama daha doğru önemli ölçüde daha az programlama ile yapar.

  • create table veya alter table tarafından başvurulan tüm tablo sütunları varsayılan anahtar sözcüğünü kullanın Transact-SQLyordam gövdesinde deyimleri. Bu-ecek önlemek boş değerlere izin vermeyen sütunlara null geçirmeden.

  • Geçici tablodaki her sütun için null olmayan veya boş kullanın. Şekilde ANSI_DFLT_ON ve ANSI_DFLT_OFF seçenekleri kontrol Veritabanı AltyapısıBu öznitelikler, create table veya alter table deyimi içinde belirtilmediği durumlarda sütun null veya not null öznitelikler atar. Bir bağlantı için bu seçenekler yordamı oluşturulan bağlantıyı daha farklı ayarlarla bir yordamı yürütür, ikinci bağlantı için oluşturulan tablonun sütunlarının farklı nullability var ve farklı davranışlar. Eğer null veya not null açıkça belirtilen her sütun için geçici tablolar, tüm bağlantılar için bu yordamı yürütmek aynı nullability kullanılarak oluşturulur.

  • Boş değerlere dönüştürmek ve sorgulardan null değerlere sahip satırlar ortadan kaldıran bir mantık değişikliği deyimleri kullanın. Unutmayın ki Transact-SQL, null boş değil veya "hiçbir şey" değer. Bilinmeyen bir değeri için bir yer tutucudur ve beklenmeyen bir davranış sonuç için sorgulama özellikle belirlediğinde, veya toplama işlevlerini kullanma neden olabilir.

  • UNION all işleci yerine birlik kullanın veya or işleçlerini, olmadığı takdirde ayrı değerleri belirli bir ihtiyaç. UNION all işleci, yinelemeler sonuç kümesini dışarı süzülür değil çünkü daha az yükü işleme gerektirir.

Genel Yorumlar

Önceden tanımlanmış en fazla büyüklük bir yordam yoktur.

Kullanıcı tanımlı değişkenleri yordam belirtilen olabilir veya @@ SPID gibi sistem değişkenleri.

İlk kez bir yordam çalıştırıldığında veri almak için uygun erişim planı belirlemek için derlendi. Sonraki yürütmeler yordamın yeniden planı plan önbelleğinde kalır zaten oluşturulan Veritabanı Altyapısı.

Bir veya daha fazla yordamlar otomatik olarak yürütebilirsiniz ne zaman SQL Serverbaşlar. Yordamlar sistem yöneticisi tarafından oluşturulmuş olması gerekir ana veritabanı ve altında yürütülen sysadmin sabit sunucu rolü bir arka plan işlemi olarak. Yordamlar, giriş veya çıkış parametreleri olamaz. Daha fazla bilgi için, bkz. Bir saklı yordamı yürütmek.

Yordamları iç içe geçmiş zaman bir yordam veya başka bir arama yürütür yönetilen kod bir clr yordamı, türü veya toplama başvurarak. Yordamlar ve yönetilen kod başvurular 32 düzeye kadar iç içe olabilir. Çağrılan yordam veya yönetilen kod referans yürütme başlar ve azaltır tarafından çağrılan yordam veya yönetilen kod referans yürütme tamamlandığında bir seviyesini artırır. Yöntemleri içinde yönetilen kod açılmak istenen iç içelik seviyesi sınırınızı sayılmaz. Ancak, bir clr saklı yordam SQL Server yönetilen sağlayıcısı aracılığıyla veri erişim işlemlerini gerçekleştirirken, ek bir iç içe geçmiş düzeyini sql yönetilen koda geçiş eklenir.

En yüksek seviyesini aşan çalışılıyor, tüm çağrı zincirini başarısız olmasına neden olur. Geçerli saklı yordamı yürütme seviyesini dönmek için @@ nestlevel işlevini kullanabilirsiniz.

Birlikte Çalışabilirlik

Veritabanı Altyapısıset quoted_ıdentıfıer ve set ansı_nulls ayarlarını kaydeder zaman bir Transact-SQLyordam oluşturulur veya değiştirilirse. Yordam çalıştırıldığında bu özgün ayarlar kullanılır. Bu nedenle, yordamı çalıştırırken set quoted_ıdentıfıer ve set ansı_nulls herhangi bir istemci oturumunun ayarlarını dikkate alınmaz.

Yordam oluşturulduğunda veya değiştirildiğinde diğer set ARITHABORT gibi set seçenekleri, set ANSI_WARNINGS veya set ANSI_PADDINGS kaydedilmez. Yordam mantığına bağlıdır üzerinde belirli bir ayarı uygun ayarı garanti prosedürü başlangıç set deyimi içerir. set deyimi için bir yordam çalıştırıldığında, yalnızca yordam çalışması bitinceye kadar ayarı etkin kalır. Ayar, sonra o çağrıldığında yordamı vardı değerine geri yüklenir. Bu yordam mantığına etkilemeden istedikleri seçeneklerini ayarlamak bağımsız istemcileri etkinleştirir.

set showplan_text ve set showplan_all dışında bir yordam içindeki herhangi bir set deyimi belirtilebilir. Bu toplu işlem yalnızca deyimlerinde olmalıdır. Seçilen ayarlama seçeneği yordamı yürütme sırasında yürürlükte kalır ve onun eski ayarına geri döner.

[!NOT]

set ANSI_WARNINGS, bir yordamda, kullanıcı tanımlı bir işlev parametreleri iletmek ya bildirmek ve toplu deyiminde değişkenleri ayarlamak zaman onur değil. Örneğin, bir değişken olarak tanımlanır, char(3) ve üç karakterden daha büyük bir değere ayarlamak, veri tanımlı boyutunu ve INSERT kesilir veya update deyimi başarılı.

Sınırlamalar ve Kısıtlamalar

create procedure deyimi ile birleştirilemez Transact-SQLtek bir toplu iş deyimlerinde.

Aşağıdaki deyimleri herhangi bir yere bir saklı yordam gövdesinde kullanılamaz.

TOPLU OLUŞTURMA

ŞEMA OLUŞTURMA

SET SHOWPLAN_TEXT

VARSAYILAN OLUŞTURMA

create veya alter TETIKLEYICI

SET SHOWPLAN_XML

create veya alter FUNCTION

create veya alter VIEW

KULLANIMIdatabase_name

create veya alter procedure

SET PARSEONLY

KURAL OLUŞTURMA

SET SHOWPLAN_ALL

Yordam, henüz varolmayan tablolara başvuruda bulunabilir. Oluşturma sırasında yalnızca sözdizimi denetimi yapılmaz. İlk kez yürütülen kadar prosedürü derlenmiş değil. Sadece derleme sırasında çözülmüş yordamda başvurulan tüm nesnelerdir. Bu nedenle, varolmayan tablolara başvuran bir sözdizimsel doğru yordamı başarıyla oluşturulabilir; başvurulan tablolar yok ancak, yordamı yürütme zaman başarısız olur.

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

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

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

Yordam uzak bir örneği üzerinde değişiklik yapar, SQL Server, değişiklikleri geri çekilemez. Uzak yordam hareketleri katılmazlar.

İçin Veritabanı Altyapısızaman içinde aşırı doğru yönteme başvurulacak.net Framework, dış ad yan tümcesinde belirtilen yöntem aşağıdaki özelliklere sahip olmalıdır:

  • Statik bir yöntem olarak bildirilmesi.

  • Aynı sayıda parametre yordamın parametre olarak alır.

  • İlgili parametreleri veri türleriyle uyumlu parametre türlerini kullanacak SQL Serveryordam. Eşleştirme hakkında bilgi SQL Serververi türleri için .NET Frameworkbkz: veri türleri, clr parametre verilerini eşleme.

Meta veri

Aşağıdaki tabloda, katalog görünümler ve saklı yordamlar hakkında bilgi dönmek için kullanabileceğiniz dinamik yönetimi görünümleri listeler.

Görünüm

Açıklama

sys.sql_modules

Tanımını verir bir Transact-SQLyordam. ŞİFRELEME seçeneği ile oluşturulan bir yordam metin kullanarak görüntülenemez sys.sql_modules Katalog görünümü.

sys.assembly_modules

clr yordam hakkında bilgi verir.

sys.parameters

Bir yordamda tanımlanan parametreler hakkında bilgi döndürür

sys.sql_expression_dependencies sys.dm_sql_referenced_entities sys.dm_sql_referencing_entities

Bir yordam tarafından başvurulan nesneleri döndürür.

Derlenmiş bir yordam boyutunu tahmin etmek için aşağıdaki performans izleme sayaçları kullanın.

Performans İzleyicisi nesnesi adı

Performans İzleyicisi sayaç adı

SQLServer: Plan önbellek nesnesi

Önbelleği isabet oranı

 

Önbellek sayfaları

 

Önbellek nesnesi sayıları *

* Bu sayaçlar önbellek nesnelerinin ad hoc dahil olmak üzere çeşitli kategorileri vardır Transact-SQL, hazırlanan Transact-SQL, yordamlar, Tetikleyiciler ve benzerleri. Daha fazla bilgi için, bkz. SQL Server, planı önbellek nesnesi.

Güvenlik

İzinler

Gerektirir CREATE PROCEDUREizni veritabanında ve ALTERolan yordamı oluşturulmaktadır veya üyelik gerektirir Şema izni db_ddladmin veritabanı rolü.

clr depolanan yordamlar için dış ad yan tümcesinde başvurulan derleme sahipliğini gerektirir veya REFERENCESBu derleme izni.

Örnekler

Kategori

Seçme sözdizimi öğeleri

Temel sözdizimi

YORDAM OLUŞTURMA

Kağıt geçirme parametreler

parametre • = varsayılan çıkış • tablo valued parametre türü • İMLECİ değişen

Saklı yordam kullanarak veri değiştirme

GÜNCELLEŞTİRME

Hata işleme

TRY…YAKALAMAK

Yordam tanımı obfuscating

WITH ENCRYPTION

Yordam yeniden derlemek için zorlama

RECOMPILE İLE

Güvenlik bağlamı ayarlama

EXECUTE AS

Temel sözdizimi

Bu bölümdeki örnekler, en az gerekli sözdizimini kullanarak create procedure deyimi temel işlevselliğini göstermektedir.

A.Basit bir Transact-sql yordamı oluşturma

Aşağıdaki örnek, tüm çalışanların döndüren saklı yordam oluşturur (ad ve soyadları birlikte), onların iş unvanları ve bir bölümü adları. Bu yordam, herhangi bir parametre kullanmaz. Örnek daha sonra üç yöntem yordamı yürütme gösterir.

USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL 
    DROP PROCEDURE HumanResources.uspGetAllEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SET NOCOUNT ON;
    SELECT LastName, FirstName, Department
    FROM HumanResources.vEmployeeDepartmentHistory;
GO

uspGetEmployeesYordam aşağıdaki şekillerde idam:

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

B.Birden çok sonuç döndüren ayarlama

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

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

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

C.Saklı yordam bir clr oluşturma

Aşağıdaki örnek oluşturur GetPhotoFromDBbaşvuran yordamını GetPhotoFromDByöntemi LargeObjectBinaryiçinde sınıf HandlingLOBUsingCLR Meclis. Yordam oluşturmadan önce HandlingLOBUsingCLRDerleme yerel veritabanında kayıtlı.

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

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

Kağıt geçirme parametreler

Bu bölümdeki örnekler, girdi ve çıktı değerleri için ve saklı yordam parametreleri nasıl kullanıldığını göstermektedir.

A.Giriş parametreleriyle yordam oluşturma

Aşağıdaki örnek, çalışanın first name ve last name değerlerini geçirerek belirli bir çalışana ait bilgi döndüren saklı yordam oluşturur. Bu yordam yalnızca tam eşleşmelerin geçirilen parametreleri kabul eder.

USE AdventureWorks2012;
GO
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, Department
    FROM HumanResources.vEmployeeDepartmentHistory
    WHERE FirstName = @FirstName AND LastName = @LastName;
GO

uspGetEmployeesYordam aşağıdaki şekillerde idam:

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';

B.Joker karakter parametreleriyle bir yordamı kullanma

Aşağıdaki örnek, çalışanlar için bilgiler çalışanların ad ve soyadını tam ya da kısmi değerlerini geçirerek döndüren saklı yordam oluşturur. Bu yordam desen geçirilen parametreleri eşleşiyor veya sağlanmazsa, önceden ayarlanmış varsayılan kullanır (son harfi ile başlayan adları D).

USE AdventureWorks2012;
GO
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, Department
    FROM HumanResources.vEmployeeDepartmentHistory
    WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;
GO

uspGetEmployees2Yordam birçok kombinasyonlar idam. Yalnızca birkaç olası kombinasyon burada 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%';

C.ÇIKIŞ parametreleri kullanma

Aşağıdaki örnek oluşturur uspGetListyordam. Bu yordamlar, belirtilen bir tutarı aşmayan fiyatlar ürünlerin listesini döndürür. Örnek kullanarak birden çok SELECTdeyimleri ve çok OUTPUTparametreleri. ÇIKIŞ parametreleri etkinleştirmek harici bir yordam, bir toplu iş veya birden fazla Transact-SQLifadesini bir değere erişmek için ayarlama yordamı yürütme sırasında.

USE AdventureWorks2012;
GO
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

Yürütme uspGetListbir listesini döndürmek için Adventure Worksdaha az maliyet ürünleri (motosiklet) daha $700. OUTPUTParametreleri @Costve @ComparePricesbir ileti dönmek için akış denetimi dil ile kullanılan iletileri pencere.

[!NOT]

Yordam oluşturulduğunda ve ayrıca değişkeni kullanıldığında çıktı değişkeni tanımlanmalıdır. Parametre adı ve değişken adı eşleşmesi gerekmez; Ancak, veri türü ve parametre konumlandırma, sürece eşleşmelidir @ListPrice= variable kullanılır.

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 bir 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.

D.Tablo değerli bir parametre kullanma

Aşağıdaki örnek, bir tabloya birden çok satır eklemek için bir tablo valued parametre türü kullanır. Örnek parametre türü oluşturur, o başvurmak için bir tablo değişkeni bildirir, parametre listesi doldurur ve sonra değerleri bir saklı yordam geçirir. Saklı yordam, bir tabloya birden çok satır eklemek için değerleri kullanır.

USE AdventureWorks2012;
GO

/* 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 [AdventureWorks2012].[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 
    [AdventureWorks2012].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO

USE AdventureWorks2012;
GO

/* 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 [AdventureWorks2012].[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 
    [AdventureWorks2012].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO

E.output imleç parametresi kullanma

Aşağıdaki örnek, yerel bir yordama sırt-e doğru arama toplu, yordam veya tetikleyiciyi imleci geçmek çıktı imleç parametresini kullanır.

Önce bildirir ve üzerinde bir imleç açar yordamı oluşturun Currencytablosu:

USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspCurrencyCursor;
GO
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

Sonra bir yerel imleç değişken bildirir, imleci yerel değişken atamak için yordamı çalıştırır ve sonra imleci satırları getirir toplu çalıştırın.

USE AdventureWorks2012;
GO
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 veri değiştirme

Bu bölümdeki örnekler, tablo veya görünümlerin veri yordamı tanımında bir Data Manipulation Language (dml) deyimi ekleyerek değiştirmek veya eklemek nasıl gösterilmektedir.

A.update kullanarak bir saklı yordam

Aşağıdaki örnek, bir saklı yordam için bir update deyimi kullanır. Yordamı bir girdi parametresini alır @NewHoursve bir çıktı parametresi @RowCount. @NewHours Parametre değeri sütunu güncelleştirmek için update deyiminde kullanılan VacationHourstabloya HumanResources.Employee. @RowCountÇıkış parametresi, yerel bir değişkene etkilenen satırların sayısını döndürmek için kullanılır. Bir servis TALEBI ifade şartlı için ayarlanan değer belirlemek için set yan tümcesinde kullanılan VacationHours. Ne zaman işçiye ödenen saatlik ( SalariedFlag = 0), VacationHoursSaat artı belirtilen değeri geçerli sayısı ayarlanır @NewHours; Aksi takdirde, VacationHoursiçinde belirtilen değere ayarlanır @NewHours.

USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.Update_VacationHours
@NewHours smallint
AS 
SET NOCOUNT ON;
UPDATE HumanResources.Employee
SET VacationHours = 
    ( CASE
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
         ELSE @NewHours
       END
    )
WHERE CurrentFlag = 1;
GO

EXEC HumanResources.Update_VacationHours 40;

Hata işleme

Bu bölümdeki örnekler, saklı yordam çalıştırıldığında oluşabilecek hataları işlemek için yöntemleri göstermektedir.

try… kullanmaYAKALAMAK

Aşağıdaki örnek kullanarak try…Saklı yordam yürütme sırasında yakalanan hata bilgilerini dönmek için yapı yakalamak.

USE AdventureWorks2012;
GO

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;

/* 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;

DROP PROCEDURE Production.uspDeleteWorkOrder;

USE AdventureWorks2012;
GO

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;

/* 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;

DROP PROCEDURE Production.uspDeleteWorkOrder;

Yordam tanımı obfuscating

Bu bölümdeki örnekler, saklı yordam tanımı karartan gösterilmiştir.

A.İLE şifreleme seçeneğini kullanma

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

USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'HumanResources.uspEncryptThis', 'P' ) IS NOT NULL 
    DROP PROCEDURE HumanResources.uspEncryptThis;
GO
CREATE PROCEDURE HumanResources.uspEncryptThis
WITH ENCRYPTION
AS
    SET NOCOUNT ON;
    SELECT BusinessEntityID, JobTitle, NationalIDNumber, VacationHours, SickLeaveHours 
    FROM HumanResources.Employee;
GO

WITH ENCRYPTIONBilgisayardan için farklı seçeneği gösterir yordam definition sistem Kataloğu sorgulama veya meta verilerini kullanma fonksiyonlar zaman tarafından aşağıdaki örneklerde gösterildiği gibi.

Run sp_helptext:

EXEC sp_helptext 'HumanResources.uspEncryptThis';

EXEC sp_helptext 'HumanResources.uspEncryptThis';

Sonuç kümesi buradadır.

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

Doğrudan sorgu sys.sql_modulesKatalog görünümü:

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

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

Sonuç kümesi buradadır.

definition

--------------------------------

NULL

Yordam yeniden derlemek için zorlama

Bu bölümdeki örnekler, yordamı her zaman yürütülecek olan yeniden derleyin zorlamak için WITH yeniden DERLEYIN yan tümcesini kullanın.

A.WITH yeniden DERLEYIN seçeneği kullanılarak

WITH RECOMPILEYan tümcesi yordamı için sağlanan parametreleri tipik olmayacak ve yeni bir yürütme planı değil önbelleğe veya bellekte depolanan yararlıdır.

USE AdventureWorks2012;
GO
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;
GO

Güvenlik bağlamı ayarlama

Bu bölümdeki örnekler kullanmak execute as yan tümcesi içinde saklı yordamı yürütür güvenlik bağlamını ayarlamak için.

A.execute as kullanarak yan tümcesi

Aşağıdaki örnek kullanarak execute as olan bir yordam yürütülen güvenlik bağlamı belirtmek için yan tümcesi. Örnekte, seçenek CALLERyordamı çağırır, bunu kullanıcının bağlamında yürütülebilecek belirtir

USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL 
    DROP PROCEDURE Purchasing.uspVendorAllInfo;
GO
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

B.Özel izin oluşturma ayarlar

Aşağıdaki örnek, bir veritabanı işlemi için özel izinler oluşturmak için execute as kullanır. truncate table gibi bazı işlemleri c.Grantable izinleri yoktur. truncate table deyimi içinde saklı bir yordam ve yordamı tabloyu değiştirme izinleri olan bir kullanıcı çalıştırmak belirterek birleşmeyle, yordam yürütme izinlerini vermek kullanıcı tablo kesecek şekilde izinler genişletebilirsiniz.

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

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

Ayrıca bkz.

Başvuru

alter procedure (Transact-sql)

Akış denetimi dil (Transact-sql)

Veri Türleri (Transact-SQL)

DECLARE @local\_variable (Transact-SQL)

procedure (Transact-sql) bırak

execute (Transact-sql)

execute (Transact-sql)

Sp_procoption (Transact-sql)

Sp_recompile (Transact-sql)

sys.sql_modules (Transact-sql)

kullanmasys.objectsvesys.parametersKullanıcı (Transact-sql)

sys.procedures (Transact-sql)

c.sys.sql_expression_dependencies (Transact-sql)

sys.assembly_modules (Transact-sql)

sys.numbered_procedures (Transact-sql)

sys.numbered_procedure_parameters (Transact-sql)

OBJECT_DEFINITION (Transact-sql)

sys.dm_sql_referenced_entities (Transact-sql)

sys.dm_sql_referencing_entities (Transact-sql)

Kavramlar

İmleçler

Saklı yordamlar (veritabanı altyapısı)

Saklı yordam oluşturma

Tablo Valued Parametreler (veritabanı altyapısı) kullanma