execute (Transact-sql)

Bir komut veya karakter dize içinde yürütür bir Transact-SQLtoplu ya da bir aşağıdaki modüller: sistem saklı yordam, saklı yordam kullanıcı tanımlı, clr depolanan yordamı, kullanıcı tanımlı skalar değerli işlev veya genişletilmiş saklı yordamı.

Güvenlik notuGüvenlik Notu

Bir karakter dizesi ile execute aramadan önce karakter dizesi doğrulayın. Asla değil doğrulanan kullanıcı girişi inşa bir komut çalıştırır.

SQL Serverexecute deyimi doğrudan komutlar göndermek için bağlantılı sunucular için kullanılabilir şekilde genişletir. Ayrıca, bir dize veya komutu yürütüldüğü bağlamında açıkça ayarlanabilir.

Sonuç kümesi için meta verileri ile sonuç kümeleri kullanarak tanımlanabilir.

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

Sözdizimi

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH <execute_option> [ ,...n ] ]
    }
[;]

Execute a character string
{ EXEC | EXECUTE } 
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
    [ AS { LOGIN | USER } = ' name ' ]
[;]

Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
    ( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
        [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
    ) 
    [ AS { LOGIN | USER } = ' name ' ]
    [ AT linked_server_name ]
[;]

<execute_option>::=
{
        RECOMPILE 
    | { RESULT SETS UNDEFINED } 
    | { RESULT SETS NONE } 
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }
} 

<result_sets_definition> ::= 
{
    (
         { column_name 
           data_type 
         [ COLLATE collation_name ] 
         [ NULL | NOT NULL ] }
         [,...n ]
    )
    | AS OBJECT 
        [ db_name . [ schema_name ] . | schema_name . ] 
        {table_name | view_name | table_valued_function_name }
    | AS TYPE [ schema_name.]table_type_name
    | AS FOR XML 
}

Bağımsız değişkenler

  • @return\_status
    Bir modül dönüş durumunu saklayan bir isteğe bağlı bir tamsayı değişkendir. execute deyimi kullanılmadan önce toplu iş, saklı yordam veya işlev bu değişken bildirilmelidir.

    Bir skalar değerli kullanıcı tanımlı işlevi çağırmak için kullanıldığında @return\_status değişken herhangi bir skalar veri türü olabilir.

  • module_name
    Tam nonfully tam adı veya saklı yordam veya aramak için kullanıcı tanımlı fonksiyon skalar değerli olduğunu. Modül adları için kuralları ile uymak gerekir tanımlayıcıları. Genişletilmiş saklı yordamlar adları her zaman sunucu harmanlama bakılmaksızın duyarlıdır.

    Modül çalıştıran kullanıcı modülü sahip olduğu veya bu veritabanında çalıştırmak için uygun izinlere sahip başka bir veritabanında oluşturulan modül çalıştırılabilir. Bir modül çalıştıran başka bir sunucuda çalıştırılabilir SQL Servermodülünü çalıştıran kullanıcının sunucu (uzaktan erişim) kullanmak ve bu veritabanındaki modül yürütmek için gerekli izni varsa. Bir sunucu adı belirtilen ancak hiçbir veritabanı adı belirtilmezse, SQL Server Veritabanı Altyapısıkullanıcının varsayılan veritabanı modülünde arar.

  • ;number
    Grup yordamlar aynı adı için kullanılan isteğe bağlı bir tamsayıdır. Bu parametre genişletilmiş saklı yordamlar için kullanılır.

    [!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.

    Yordam grupları hakkında daha fazla bilgi için bkz: procedure (Transact-sql) oluştur.

  • @module\_name\_var
    Bir modül adı temsil eden yerel olarak tanımlanmış bir değişken adıdır.

  • @parameter
    Parametresi module_name, modülünde tanımlanan. Parametre adları öncesinde, tarafından at işareti (@). Kullanıldığında @parameter\_name= value formu, parametre adları ve sabitler yok, onlar modülünde tanımlanan sırada sağlanacak. Ancak, eğer @parameter\_name= value formu için herhangi bir parametresi kullanıldığında, sonraki tüm parametreler için kullanılmalıdır.

    Varsayılan olarak, NULL olabilecek parametreleridir.

  • value
    Modül veya doğrudan komut geçirmek için parametre değeridir. Parametre adı belirtilmezse, parametre değerlerini modülünde tanımlanan sırada sağlanmalı.

    Bağlantılı sunucularda doğrudan Komutlar Yürütülüyor, parametre değerleri sırası üzerinde bağlantılı sunucu ole db sağlayıcısı bağlıdır. En ole db sağlayıcıları soldan sağa parametreleri için değerler bağlama.

    Eğer bir parametre değeri olan bir nesne adı, karakter dizesi veya bir veritabanı adı veya şema adı nitelikli, Bütün adı tek tırnak işareti içine alınmalıdır. Eğer bir parametre değeri bir anahtar kelime, anahtar kelime çift tırnak içine alınmalıdır.

    Varsayılan bir modülde tanımlanmışsa, bir kullanıcı bir parametre belirtmeden modülü yürütebilirsiniz.

    Varsayılan değer null da olabilir. Genellikle, modül tanımı parametre değeri null ise alınması gereken eylemi belirtir.

  • @variable
    Bir parametre veya dönüş parametresi depolayan değişkendir.

  • ÇIKIŞ
    Modül ya da komut dizesini parametre verdiğini belirtir. Eşleşen parametre modül ya da komut dizesi de çıktı anahtar sözcüğü kullanılarak oluşturulmuş olması gerekir. İmleç değişken parametreleri olarak kullandığınızda, bu anahtar sözcüğü kullanın.

    Eğer value çıktı için ilgili değişiklikleri bir bağlantılı sunucu karşı yürütülen bir modül olarak tanımlanan @parameter gerçekleşen sırt-e doğru değişken modülü yürütme sonunda sağlayıcısı ole db tarafından kopyalanır.

    ÇIKIŞ parametreleri kullanılır ve dönüş değerleri arama toplu veya modül içindeki diğer deyimleri kullanmak için niyet ise, parametre değeri değişken olarak, gibi geçirilmesi gereken @parameter = @variable. Bir modül modülünde bir çıkış parametresi olarak tanımlanmamış parametresi çıkış belirterek yürütülemiyor. Sabitler modülü çıktı kullanarak geçirilemez; dönüş parametresi, bir değişken adı gerektirir. Değişkenin veri türü olarak bildirilmelidir ve yordam yürütülmeden önce bir değer atanır.

    execute karşı uzak bir saklı yordam veya bir bağlantılı sunucu karşı doğrudan bir komut çalıştırmak için kullanıldığında, çıkış parametreleri büyük nesne (lob) veri türleri herhangi biri olamaz.

    Dönüş parametreleri lob veri türleri dışında herhangi bir veri türünde olabilir.

  • DEFAULT
    Parametre varsayılan değeri modülünde tanımlanan sağlar. Ne zaman modül tanımlanan varsayılan olmayan bir parametre ve her parametre için bir değer beklediğini eksik veya default anahtar sözcük belirtilirse, bir hata oluşur.

  • @string\_variable
    Yerel bir değişken adıdır. @string\_variable can be any char, varchar, nchar, or nvarchar data type. Bunlar (max)veri türlerini.

  • [n] 'tsql_string'
    Sürekli bir dizedir. tsql_stringolabilir nvarcharya varcharveri türü. n dahil ise, dize olarak yorumlanır nvarcharveri türü.

  • as <context_specification>
    Deyimi yürütüldüğü bağlamını belirtir.

  • LOGIN
    Oturum açma özellikleri bağlamında belirtir. Kimliğe bürünme kapsamı sunucusudur.

  • KULLANICI
    Geçerli veritabanında bir kullanıcı bağlamı özellikleri belirtir. Veritabanı için kimliğe bürünme kapsamı sınırlıdır. Veritabanı kullanıcı bağlamı geçin, kullanıcının sunucu düzeyinde izinleri devralmaz.

    Önemli notÖnemli

    Veritabanı kullanıcı bağlamı geçiş etkin durumdayken veritabanı dışındaki kaynaklara erişim girişimi deyimi başarısız olmasına neden olur. Bu kullanım içerir databasedeyimleri, dağıtılmış sorgular ve sorguları üç veya dört yarı tanımlayıcıları kullanarak başka bir veritabanına başvuru.

  • 'name'
    Geçerli kullanıcı veya oturum açma adıdır. namebir üyesi olmanız sysadmin sabit sunucu rolü veya sorumlusu olarak mevcut sys.database_principals veya sys.server_principals, sırasıyla.

    nament AUTHORITY\LocalService, nt AUTHORITY\NetworkService veya nt AUTHORITY\LocalSystem gibi yerleşik bir hesap olamaz.

    Daha fazla bilgi için bkz: kullanıcı veya oturum açma adı belirtme bu konuda.

  • [n] 'command_string'
    Bağlantılı sunucu üzerinden iletilmesi için komutu içeren sabit bir dizedir. n dahil ise, dize olarak yorumlanır nvarchar veri türü.

  • [?]
    Hangi değerleri sağlanacak olan içinde parametreleri gösterir <arg listesi> bir EXEC('…', <arg-list>), içinde kullanılan doğrudan komut <linkedsrv> deyimi.

  • ATlinked_server_name
    Belirleyen command_stringkarşı yürütülen linked_server_nameve sonuçları, varsa döndürülür istemciye. linked_server_nameYerel sunucu varolan bir bağlantılı sunucu tanımı başvurması gerekir. Bağlantılı sunucuları kullanılarak tanımlanmış sp_addlinkedserver.

  • İLE <execute_option>
    Olası seçenekler yürütün. SONUÇ kümeleri seçenekleri bir INSERT… belirtilemezexec deyimi.

    Terim

    Tanım

    YENİDEN DERLE

    Derlenmiş, kullanılan ve modül yürütüldükten sonra atılan yeni bir plan zorlar. Varolan bir sorgu planı modülü ise bu planı önbellekte kalır.

    Tedarik parametre Atipik ise veya verilerin önemli ölçüde değişmesi durumunda bu seçeneği kullanın. Bu seçenek, genişletilmiş saklı yordamlar için kullanılmaz. Pahalı olduğundan, bu seçenek idareli kullanmanızı öneririz.

    NotNot
    Eğer WITH yeniden DERLEYIN opendatasource sözdizimini kullanan bir saklı yordam çağrılırken kullanamazsınız.Four-part nesne adı belirtildiğinde WITH yeniden DERLEYIN seçeneği yoksayılır.

    TANIMSIZ SONUÇ KÜMELERİ

    Bu seçenek, döndürülür ne olur, hiçbir garantisi sağlar ve hiçbir tanım sağlanmıştır. Deyimi herhangi bir sonuç döndürülür ya da hiçbir sonuç döndürülür hatasız yürütür. Yoksa bir result_sets_option değil sonuç kümeleri varsayılan davranışı tanımsızdır.

    HİÇBİRİ SONUÇ KÜMELERİ

    Execute deyimi hiçbir sonuç döndürmez garanti eder. Hiçbir sonuç döndürülmezse toplu iş iptal edildi.

    <result_sets_definition>

    Sonuç olarak result_sets_definition'de belirtilen geri gelecek garantisi sağlar. Birden çok sonuç kümeleri döndüren deyimler sağlamak için birden çok result_sets_definitionbölümler. Her alın result_sets_definitionparantez içinde virgüllerle ayrılmış. Daha fazla bilgi için bkz: <result_sets_definition > Bu konuda.

  • <result_sets_definition>
    Yürütülen deyimleri tarafından döndürülen sonuç kümeleri açıklar. Result_sets_definition yan tümceleri şu anlama gelir

    Terim

    Tanım

    {

        sütun_adı

        DATA_TYPE

        [collate collation_name]

        [NULL | NULL]

    }

    TerimTanım
    sütun_adıHer sütun adları.Sütun sonuç kümesinden farklıysa, bir hata oluşur ve toplu iş iptal edildi.Bir sütun adı sonuç kümesinden farklıysa, döndürülen sütun adı tanımlı adı için ayarlanır.
    DATA_TYPEHer sütun veri türleri.Veri türleri farklı bir veri türüne örtük dönüştürme gerçekleştirilir.Toplu dönüştürme başarısız olursa durduruldu
    collate collation_nameHer sütunun harmanlama.Bir harmanlama uyumsuzluk ise örtülü bir harmanlama denenir.Başarısız olursa, toplu iş iptal edildi.
    NULL | NOT NULLHer sütunun nullability.Tanımlanan nullability null ve veri olmadığını içeren bir hata oluşursa NULL döndürdü ve toplu iş iptal edildi.Belirtilmezse, varsayılan değer ANSI_NULL_DFLT_ON ve ANSI_NULL_DFLT_OFF seçenekleri ayarı için uygundur.

    DB_NAME

    Tablo, görünüm veya tablo içeren veritabanı adını işlevi değerli.

    schema_name

    Tablo, görünüm veya tablo sahibi şema adı işlevi değerli.

    table_name | view_name | table_valued_function_name

    Döndürülen sütunlar tablosunda belirtilen görüntülemek veya tablo değerli işlev adlı olacağını belirtir. Tablo değişkenlerini, geçici tablolar ve eşanlamlılar as nesnesi sözdizimi desteklenmiyor.

    TÜRÜ [schema_name.]table_type_name

    Sütunları bu tablo türü belirtilmiş olması döndürülen belirtir.

    XML OLARAK

    Döndürülen sonuç... seçme tarafından üretilen olacağını belirtir XML … (olmadan type yönergesi) deyimi.

    Yürütme sırasında verilen gerçek sonuç sonuç kümeleri ile yan tümcesi aşağıdaki yollardan birini kullanarak tanımlanan sonuç farklı olabilir: sonuç sayısını ayarlar, sütunlar, sütun adı, nullability ve veri türü sayısı. Sonuç kümesi sayısını farklıysa, bir hata oluşur ve toplu iş iptal edildi.

Açıklamalar

Parametreleri kullanarak tarafından sağlanan valueveya kullanarak @parameter\_name = value.bir parametre değil; hareketin bir parçası olduğunu parametre değeri daha sonra geri döndürülüyor bir harekette değişirse bu nedenle parametresi önceki değerine geri değil. Çağırana döndürülen değeri her zaman modülü verir zaman değerdir.

İç içe oluşur, bir modül başka bir çağrı veya bir ortak dil çalışma zamanı (clr) modülü, kullanıcı tanımlı türü veya toplama başvurarak yönetilen kod çalıştırır. Adlı modül veya yönetilen kod referans yürütme başlatır ve adlı modül veya yönetilen kod referans tamamladığında indirildiği seviyesini artırılır. En fazla 32 iç içe düzeyleri aşan başarısız tam arama zinciri neden olur. Mevcut seviyesini @@ nestlevel sistem işlevi içinde depolanır.

Çünkü uzak saklı yordamlar ve genişletilmiş saklı yordamlar bir işlem kapsamı içinde (bir dağıtılmış hareket BEGIN bildirimine veya çeşitli yapılandırma seçenekleri ile kullanıldığında verilen sürece) değil, onlara çağrıları aracılığıyla yürütülen komutları geri alınamaz. Daha fazla bilgi için Sistem saklı yordamları (Transact-sql)ve BEGIN dağıtılmış hareket (Transact-sql).

Bir imleç için ayrılan bir imleç değişken geçen bir yordam çalıştırırsanız, imleç değişkenleri kullandığınızda bir hata oluşur.

execute anahtar sözcük deyimi birinci toplu ise modülleri yürütürken belirtmek gerekmez.

Daha fazla bilgi için clr depolanan yordamlar için bkz: clr depolanan yordamlar.

execute ile saklı yordamları kullanma

execute anahtar sözcük deyimi birinci toplu olduğunda saklı yordamları çalıştırdığınızda belirtmek gerekmez.

SQL Serversistem saklı yordamlar başlangıç karakterleri ile sp_. Fiziksel olarak depolandıkları kaynak veritabanı, ama mantıklı görünen sysher sistem ve kullanıcı tanımlı veritabanı şemasını. Bir toplu iş veya kullanıcı tanımlı bir saklı yordam veya işlev gibi bir modül içinde bir sistem saklı yordamını çalıştırdığınızda saklı yordam adı ile hak öneririz sysşema adı.

SQL Serversistem genişletilmiş saklı yordamlar başlangıç karakterleri ile xp_,ve bunlar içerdiği dboşema masterveritabanı. Genişletilmiş saklı yordamı, bir toplu iş veya kullanıcı tanımlı saklı yordam veya işlev gibi bir modül içinde bir sistem yürüttüğünüzde saklı yordam adı ile hak öneririz master.dbo.

Bir toplu iş veya kullanıcı tanımlı bir saklı yordam veya işlev gibi bir modül içinde bir kullanıcı tanımlı saklı yordam çalıştırdığınızda şema adı saklı yordam adıyla hak öneririz. Aynı ada sahip bir sistem saklı yordam kullanıcı tanımlı bir saklı yordam adı önermiyoruz. Saklı yordamları çalıştırma hakkında daha fazla bilgi için bkz: Bir saklı yordamı yürütmek.

execute karakter dizesi ile kullanma

Önceki sürümlerinde SQL Server, karakter dizeleri için 8.000 bayt sınırlı. Bu geniş dinamik yürütme dizeleri bitiştirmek gerektirir. De SQL Server, varchar(max)ve nvarchar(max)veri türleri karakter dizeleri için en çok 2 gigabayt veri izin veren belirtilebilir.

Veritabanı içerik değişiklikleri yalnızca execute deyimi sonuna kadar geçen. Örneğin, sonra EXECBu aşağıdaki deyimde çalıştırılır, veritabanı içerik olduğunu master.

USE master; EXEC ('USE AdventureWorks2012; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');

USE master; EXEC ('USE AdventureWorks2012; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');

Bağlam Geçişi

Sen-ebilmek kullanma AS { LOGIN | USER } = ' name 'dinamik bir deyimi yürütme içeriği geçmek için yan. Ne zaman içerik anahtarı belirtildiği gibi EXECUTE ('string') AS <context_specification>, içerik geçiş süresi yürütülen sorgu kapsamı sınırlıdır.

Kullanıcı veya oturum açma adı belirtme

Belirtilen kullanıcı veya oturum açma adı AS { LOGIN | USER } = ' name 'sorumlusu olarak mevcut olmalıdır sys.database_principalsya sys.server_principals, sırasıyla veya deyimi başarısız olur. Ayrıca, anapara özelliklerini Al izni verilmiş olması gerekir. Arayan veritabanı sahibi veya üyesi olduğu sürece sysadminsabit sunucu rolü, hatta kullanıcı veritabanı veya örneğini erişirken sorumlusunun bulunması gerekir SQL Serverbir Windows Grup üyeliği. Örneğin, aşağıdaki koşullar varsayılmaktadır:

  • CompanyDomain\SQLUsersGrup erişimi olan Salesveritabanı.

  • CompanyDomain\SqlUser1üyesi olduğu SQLUsersve bu nedenle, örtülü erişimi olan Salesveritabanı.

Her ne kadar CompanyDomain\SqlUser1veritabanı üyeliği yoluyla erişimi olan SQLUsersGrup, deyim EXECUTE @string\_variable AS USER = 'CompanyDomain\SqlUser1' başarısız olacaktır, çünkü CompanyDomain\SqlUser1veritabanı sorumlusu yok.

En İyi Yöntemler

Bir oturum açma veya ifade veya modülü içinde tanımlanan işlemleri gerçekleştirmek için gereken en az ayrıcalıkları olan bir kullanıcı belirtin. Örneğin, yalnızca veritabanı düzeyinde izinler gereklidir, sunucu düzeyinde izinleri olan bir oturum açma adı belirtme; veya bu izinleri gerekli olmadıkça bir veritabanı sahibi hesabı belirtin.

İzinler

İzinlerini execute deyimi çalıştırmak için gerekli değildir. Ancak, execute dize içinde başvurulan securables üzerinde izinleri gereklidir. Örneğin, dize bir INSERT deyimi içeriyorsa, arayan execute deyimi hedef tablo INSERT izni olmalıdır. execute deyimi içinde bir modül dahil olsa bile izinlerini execute deyimi karşılaşıldığında, zaman kontrol edilir.

Yürütme izinleri için bir modül varsayılan sahibi modülü, kim bunları diğer kullanıcılara aktarabilirsiniz. Bu dize yürütür bir modül çalıştırıldığında, izinleri modülü yürütür kullanıcı bağlamında değil, modülü oluşturan kullanıcının bağlamında denetlenir. Aynı kullanıcı arama modülü ve çağrıldığını modülü sahipse, ancak execute izni denetimi için ikinci modülde gerçekleştirilir.

Modül diğer veritabanı nesneleri erişirse, yürütme modülü üzerinde execute izni olması ve aşağıdakilerden biri doğru olduğunda başarılı olur:

  • Modül execute as user veya self işaretlenmiş ve modül sahibi başvurulan nesne üzerinde ilgili izinleri vardır. Bir modül içinde kimliğe bürünme hakkında daha fazla bilgi için bkz: execute as yan tümcesi (Transact-sql).

  • Modül execute as arayan işaretlenmiş ve nesne üzerinde ilgili izinleri vardır.

  • Modül execute as işaretlenmiş user_name, ve user_namenesne üzerinde ilgili izinleri vardır.

Bağlam Geçişi izinleri

execute as a giriş belirtmek için arayan belirtilen oturum açma adı özelliklerini Al izni olmalıdır. execute as bir veritabanı kullanıcı belirtmek için arayan belirtilen kullanıcı adına özelliklerini Al izni olmalıdır. Yürütme içeriği yok belirtilir veya execute as arayan belirtilen özelliklerini Al izni gerekmez.

Örnekler

A.Tek bir parametreye geçmek için execute kullanma

uspGetEmployeeManagersSaklı yordam beklediği bir parametre (@EmployeeID). Aşağıdaki örnekler idam uspGetEmployeeManagers saklı yordamı ile Employee ID 6parametre değeri olarak.

USE AdventureWorks2012;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO

USE AdventureWorks2012;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO

Değişken yürütme açıkça adlandırılabilir:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Aşağıdaki toplu iş içinde ilk deyim olup olmadığını ya da bir osqlya sqlcmdkomut dosyası, exec gerekli değildir.

dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

B.Birden çok parametre kullanma

Aşağıdaki örnek yürütür spGetWhereUsedProductIDsaklı yordamını. İki parametreleri iletir: ilk parametre bir ürün kimliğidir (819) ve ikinci parametre, @CheckDate,olan bir datetimedeğer.

USE AdventureWorks2012;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

USE AdventureWorks2012;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

C.execute 'tsql_string' kullanma bir değişken

Aşağıdaki örnekte gösterildiği nasıl EXECUTEdeğişkenleri içeren dinamik yapılı kolları dizeleri. Bu örnek oluşturur tables_cursortüm kullanıcı tanımlı tablolar listesini tutmak için imleci AdventureWorks2012 veritabanını ve tabloları tüm dizinleri yeniden oluşturmak için liste kullanır.

USE AdventureWorks2012;
GO
DECLARE tables_cursor CURSOR
   FOR
   SELECT s.name, t.name 
   FROM sys.objects AS t
   JOIN sys.schemas AS s ON s.schema_id = t.schema_id
   WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname sysname;
DECLARE @tablename sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN;
   EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
   FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END;
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO

USE AdventureWorks2012;
GO
DECLARE tables_cursor CURSOR
   FOR
   SELECT s.name, t.name 
   FROM sys.objects AS t
   JOIN sys.schemas AS s ON s.schema_id = t.schema_id
   WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname sysname;
DECLARE @tablename sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN;
   EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
   FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END;
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO

D.execute ile uzak bir saklı yordam kullanarak

Aşağıdaki örnek yürütür uspGetEmployeeManagersuzak sunucuda saklı yordam SQLSERVER1ve başarı ya da başarısızlık belirten dönüş durumunu saklar @retstat.

DECLARE @retstat int;
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;

DECLARE @retstat int;
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;

E.execute kullanarak bir saklı yordam değişken

Aşağıdaki örnek, bir saklı yordam adı temsil eden bir değişken oluşturur.

DECLARE @proc_name varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;

DECLARE @proc_name varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;

F.Varsayılan ile execute kullanma

Aşağıdaki örnek, birinci ve üçüncü parametreler için varsayılan değerlerle bir saklı yordam oluşturur. Yordam çalıştırıldığında, birinci ve üçüncü parametreler için değer çağrısında iletilen ya da varsayılan değer belirtildiğinde bu varsayılanları eklenir. Çeşitli şekillerde Not DEFAULTanahtar-ebilmek var olmak kullanılmış.

USE AdventureWorks2012;
GO
IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL
   DROP PROCEDURE dbo.ProcTestDefaults;
GO
-- Create the stored procedure.
CREATE PROCEDURE dbo.ProcTestDefaults (
@p1 smallint = 42, 
@p2 char(1), 
@p3 varchar(8) = 'CAR')
AS 
   SET NOCOUNT ON;
   SELECT @p1, @p2, @p3
;
GO

Proc_Test_DefaultsSaklı yordam birçok kombinasyonlar idam.

-- Specifying a value only for one parameter (@p2).
EXECUTE dbo.ProcTestDefaults @p2 = 'A';
-- Specifying a value for the first two parameters.
EXECUTE dbo.ProcTestDefaults 68, 'B';
-- Specifying a value for all three parameters.
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';
-- Using the DEFAULT keyword for the first parameter.
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';
-- Specifying the parameters in an order different from the order defined in the procedure.
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';
-- Using the DEFAULT keyword for the first and third parameters.
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;

G.Linked_server_name at execute ile kullanma

Aşağıdaki örnek, bir uzak sunucuya komut dizesini geçer. Oluşturduğu bir bağlı sunucu SeattleSalesbaşka bir örneğine işaret eden SQL Serverve bir ddl deyimi yürütür (CREATE TABLE) bağlantılı sunucu karşı.

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks2012.dbo.SalesTbl 
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;
GO

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks2012.dbo.SalesTbl 
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;
GO

H.YÜRÜTME RECOMPILE ile kullanma

Aşağıdaki örnek yürütür Proc_Test_ Defaults saklı yordam zorlar Derlenecek için yeni bir sorgu planı kullanılan ve modül yürütüldükten sonra atılan.

EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO

EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO

I.execute ile kullanıcı tanımlı bir işlev kullanma

Aşağıdaki örnek yürütür ufnGetSalesOrderStatusTextskalar kullanıcı tanımlı bir işlev. Değişken kullanır @returnstatusişlevi tarafından döndürülen değeri depolamak için. Bir girdi parametresini, işlev bekliyor @Status. Bu olarak tanımlanan bir tinyintveri türü.

USE AdventureWorks2012;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO

USE AdventureWorks2012;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO

J.Bağlantılı bir sunucu bir Oracle veritabanını sorgulamak için execute kullanarak

Aşağıdaki örnek birkaç yürütür SELECTdeyimlerini uzak Oracle Sunucusu. Örneğin Oracle Sunucusu bağlantılı bir sunucu ekleme ve bağlantılı sunucu oturumu oluşturma başlar.

-- Setup the linked server.
EXEC sp_addlinkedserver  
        @server='ORACLE',
        @srvproduct='Oracle',
        @provider='OraOLEDB.Oracle', 
        @datasrc='ORACLE10';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname='ORACLE',
    @useself='false', 
    @locallogin=null, 
    @rmtuser='scott', 
    @rmtpassword='tiger';
 
EXEC sp_serveroption 'ORACLE', 'rpc out', true;
GO
 
-- Execute several statements on the linked Oracle server.
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;
GO
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v INT; 
SET @v = 7902;
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO 

-- Setup the linked server.
EXEC sp_addlinkedserver  
        @server='ORACLE',
        @srvproduct='Oracle',
        @provider='OraOLEDB.Oracle', 
        @datasrc='ORACLE10';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname='ORACLE',
    @useself='false', 
    @locallogin=null, 
    @rmtuser='scott', 
    @rmtpassword='tiger';
 
EXEC sp_serveroption 'ORACLE', 'rpc out', true;
GO
 
-- Execute several statements on the linked Oracle server.
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;
GO
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v INT; 
SET @v = 7902;
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO 

K.İçerik başka bir kullanıcıya geçiş yapmak için execute as user kullanma

Aşağıdaki örnek yürütür bir Transact-SQLbir tablo oluşturur ve belirtir dize AS USERçağıran için deyimi yürütme içeriği geçmek için yan User1. Veritabanı Altyapısıİzinlerini kontrol edecek User1deyimi çalıştırıldığında. User1veritabanında bir kullanıcı olarak mevcut olmalıdır ve tablolar oluşturmak için izninizin olması gerekir Salesşema veya deyimi başarısız.

USE AdventureWorks2012;
GO
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')
AS USER = 'User1';
GO

USE AdventureWorks2012;
GO
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')
AS USER = 'User1';
GO

L.YÜRÜTME ve LİNKED_SERVER_NAME parametre kullanma

Aşağıdaki örnek komut dizesi uzak bir sunucuya bir soru işareti kullanarak geçirir (?) parametresi için yer tutucu. Bağlantılı sunucu örnek oluşturur SeattleSalesbaşka bir örneği bu noktalara SQL Serverve bir SELECTdeyimi bağlantılı sunucu karşı. SELECTDeyimi için bir yer tutucu olarak soru işareti kullanır ProductIDparametresi (952), hangi ifadenin sağlanır.

-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name 
    FROM AdventureWorks2012.Production.Product
    WHERE ProductID = ? ', 952) AT SeattleSales;
GO

-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name 
    FROM AdventureWorks2012.Production.Product
    WHERE ProductID = ? ', 952) AT SeattleSales;
GO

M.Tek bir sonuç tanımlanacak execute kullanarak ayarlama

Önceki örneklerin idam EXEC dbo.uspGetEmployeeManagers 6;olan 7 sütun döndürdü. Kullanma aşağıdaki örnekte gösterilmiştir WITH RESULT SETsözdizimi dönen adlarını ve veri türlerini değiştirmek için sonuç kümesini.

USE AdventureWorks2012;
GO

EXEC uspGetEmployeeManagers 16
WITH RESULT SETS
( 
   ([Reporting Level] int NOT NULL,
    [ID of Employee] int NOT NULL,
    [Employee First Name] nvarchar(50) NOT NULL,
    [Employee Last Name] nvarchar(50) NOT NULL,
    [Employee ID of Manager] nvarchar(max) NOT NULL,
    [Manager First Name] nvarchar(50) NOT NULL,
    [Manager Last Name] nvarchar(50) NOT NULL )
);

USE AdventureWorks2012;
GO

EXEC uspGetEmployeeManagers 16
WITH RESULT SETS
( 
   ([Reporting Level] int NOT NULL,
    [ID of Employee] int NOT NULL,
    [Employee First Name] nvarchar(50) NOT NULL,
    [Employee Last Name] nvarchar(50) NOT NULL,
    [Employee ID of Manager] nvarchar(max) NOT NULL,
    [Manager First Name] nvarchar(50) NOT NULL,
    [Manager Last Name] nvarchar(50) NOT NULL )
);

N.İki sonuç tanımlanacak execute kullanarak ayarlar

Birden çok sonuç döndüren bir deyimi yürütme ayarladığınızda, her beklenen sonuç kümesi tanımlar. Aşağıdaki örnek AdventureWorks2012 iki sonuç kümeleri döndüren bir yordam oluşturur. Daha sonra prosedür kullanılarak yürütülür Sonuç kümeleri ile yan ve iki sonuç belirtme ayarla tanımlar.

USE AdventureWorks2012;
GO

--Create the procedure
CREATE PROC Production.ProductList @ProdName nvarchar(50)
AS
-- First result set
SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE Name LIKE @ProdName;
-- Second result set 
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders
    FROM Production.Product AS P
    JOIN Sales.SalesOrderDetail AS S
        ON P.ProductID  = S.ProductID 
    WHERE Name LIKE @ProdName
    GROUP BY Name;
GO

-- Execute the procedure 
EXEC Production.ProductList '%tire%'
WITH RESULT SETS 
(
    (ProductID int,   -- first result set definition starts here
    Name Name,
    ListPrice money)
    ,                 -- comma separates result set definitions
    (Name Name,       -- second result set definition starts here
    NumberOfOrders int)
);

USE AdventureWorks2012;
GO

--Create the procedure
CREATE PROC Production.ProductList @ProdName nvarchar(50)
AS
-- First result set
SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE Name LIKE @ProdName;
-- Second result set 
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders
    FROM Production.Product AS P
    JOIN Sales.SalesOrderDetail AS S
        ON P.ProductID  = S.ProductID 
    WHERE Name LIKE @ProdName
    GROUP BY Name;
GO

-- Execute the procedure 
EXEC Production.ProductList '%tire%'
WITH RESULT SETS 
(
    (ProductID int,   -- first result set definition starts here
    Name Name,
    ListPrice money)
    ,                 -- comma separates result set definitions
    (Name Name,       -- second result set definition starts here
    NumberOfOrders int)
);

Ayrıca bkz.

Başvuru

@@ nestlevel (Transact-sql)

DECLARE @local\_variable (Transact-SQL)

execute as yan tümcesi (Transact-sql)

osql yardımcı programı

revert (Transact-sql)

sp_addlinkedserver (Transact-sql)

Sqlcmd yardımcı programı

SUSER_NAME (Transact-sql)

sys.database_principals (Transact-sql)

sys.server_principals (Transact-sql)

col_name (Transact-sql)

opendatasource (Transact-sql)

Kavramlar

Sorumluları (veritabanı altyapısı)