Aracılığıyla paylaş


EXECUTE (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ı

Bir komut dizesini veya karakter dizesini Transact-SQL bir toplu işte veya şu modüllerden birinde yürütür: sistem saklı yordamı, kullanıcı tanımlı saklı yordam, CLR saklı yordamı, skaler değerli kullanıcı tanımlı işlev veya genişletilmiş saklı yordam. EXEC veya EXECUTE deyimi, bağlı sunuculara geçiş komutları göndermek için kullanılabilir. Ayrıca, bir dize veya komutun yürütülürken bağlam açıkça ayarlanabilir. Sonuç kümesinin meta verileri WITH RESULT SETS seçenekleri kullanılarak tanımlanabilir.

Important

Karakter dizesiyle EXECUTE çağırmadan önce karakter dizesini doğrulayın. Hiçbir zaman doğrulanmamış kullanıcı girişinden yapılandırılmış bir komutu yürütmeyin.

Transact-SQL söz dizimi kuralları

Syntax

Aşağıdaki kod bloğu, SQL Server 2019 (15.x) ve sonraki sürümlerde söz dizimini gösterir. Alternatif olarak, bunun yerine SQL Server 2017 ve önceki söz dizimine bakın.

SQL Server 2019 ve sonraki sürümlerin söz dizimi.

-- 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 ]
    [ AT DATA_SOURCE data_source_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
}

Aşağıdaki kod bloğu, SQL Server 2017 (14.x) ve önceki sürümlerde söz dizimini gösterir. Alternatif olarak, bunun yerine sql server 2019 söz dizimine bakın.

SQL Server 2017 ve önceki sürümlerin söz dizimi.

-- 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
}

OLTP In-Memory söz dizimi.

-- Execute a natively compiled, scalar user-defined function
[ { EXEC | EXECUTE } ]
    {
      [ @return_status = ]
      { module_name | @module_name_var }
        [ [ @parameter = ] { value
                           | @variable
                           | [ DEFAULT ]
                           }
        ]
      [ ,...n ]
      [ WITH <execute_option> [ ,...n ] ]
    }
<execute_option>::=
{
    | { RESULT SETS UNDEFINED }
    | { RESULT SETS NONE }
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}

Azure SQL Veritabanı söz dizimi.

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

-- Execute a character string
{ EXEC | EXECUTE }
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
    [ AS {  USER } = ' 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
}

Azure Synapse Analytics ve Paralel Veri Ambarı söz dizimi.

-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
    procedure_name
        [ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ ; ]

-- Execute a SQL string
{ EXEC | EXECUTE }
    ( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]

Microsoft Fabric için söz dizimi.

-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
    procedure_name
        [ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
        [ WITH <execute_option> [ ,...n ] ]  }
[ ; ]

-- Execute a SQL string
{ EXEC | EXECUTE }
    ( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]

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

Arguments

@return_status

Modülün dönüş durumunu depolayan isteğe bağlı bir tamsayı değişkeni. Bu değişkenin bir EXECUTE deyiminde kullanılmadan önce toplu işte, saklı yordamda veya işlevde bildirilmesi gerekir.

Skaler değerli kullanıcı tanımlı bir işlevi çağırmak için kullanıldığında, @return_status değişkeni herhangi bir skaler veri türünde olabilir.

module_name

Çağrılacak saklı yordamın veya skaler değerli kullanıcı tanımlı işlevin tam veya uygun olmayan adı. Modül adlarıtanımlayıcılarının kurallarına uymalıdır. Genişletilmiş saklı yordamların adları, sunucunun harmanlanmasından bağımsız olarak her zaman büyük/küçük harfe duyarlıdır.

Modülü çalıştıran kullanıcı modüle sahipse veya bu veritabanında yürütmek için uygun izne sahipse, başka bir veritabanında oluşturulmuş bir modül yürütülebilir. Modülü çalıştıran kullanıcının ilgili sunucuyu (uzaktan erişim) kullanma ve modülü bu veritabanında yürütme izni varsa, bir modül SQL Server çalıştıran başka bir sunucuda yürütülebilir. Bir sunucu adı belirtilirse ancak veritabanı adı belirtilmezse, SQL Server Veritabanı Altyapısı modülü kullanıcının varsayılan veritabanında arar.

;number

Aynı ada sahip yordamları gruplandırmak için kullanılan isteğe bağlı bir tamsayı. Bu parametre genişletilmiş saklı yordamlar için kullanılmaz.

Note

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.

Yordam grupları hakkında daha fazla bilgi için bkz. CREATE PROCEDURE.

@module_name_var

Modül adını temsil eden yerel olarak tanımlanmış bir değişkenin adı.

Bu, yerel olarak derlenmiş, skaler kullanıcı tanımlı bir işlevin adını tutan bir değişken olabilir.

@parameter

modülünde tanımlandığı gibi module_nameparametresi. Parametre adlarının önünde at işareti (@) bulunmalıdır. @parameter_name = değeri formuyla kullanıldığında, parametre adlarının ve sabitlerinin modülde tanımlanma sırasına göre sağlanması gerekmez. Ancak, @parameter_name = değeri formu herhangi bir parametre için kullanılıyorsa, sonraki tüm parametreler için kullanılmalıdır.

Varsayılan olarak, parametreler null atanabilir.

value

Modüle veya geçiş komutuna geçirilir parametresinin değeri. Parametre adları belirtilmezse, parametre değerleri modülde tanımlanan sırada sağlanmalıdır.

Bağlı sunucularda geçiş komutları yürütülürken, parametre değerlerinin sırası bağlı sunucunun OLE DB sağlayıcısına bağlıdır. Ole DB sağlayıcılarının çoğu değerleri parametrelere soldan sağa bağlar.

Parametrenin değeri bir nesne adı, karakter dizesi veya veritabanı adı veya şema adıyla nitelenmişse, tam adın tek tırnak içine alınması gerekir. Parametrenin değeri bir anahtar sözcükse, anahtar sözcüğün çift tırnak içine alınması gerekir.

@ile başlamayan tek bir sözcük geçirirseniz, tırnak içine alınmaz (örneğin, parametre adında @ unutursanız), sözcük eksik tırnak işaretlerine rağmen nvarchar dizesi olarak kabul edilir.

Modülde varsayılan bir tanım varsa, kullanıcı parametre belirtmeden modülü yürütebilir.

Varsayılan da NULLolabilir. Genellikle modül tanımı, parametre değeri NULLolduğunda gerçekleştirilecek eylemi belirtir.

@variable

Parametre veya dönüş parametresi depolayan değişken.

OUTPUT

Modülün veya komut dizesinin bir parametre döndürdüğünü belirtir. Modül veya komut dizesindeki eşleşen parametre de OUTPUTanahtar sözcüğü kullanılarak oluşturulmuş olmalıdır. Parametre olarak imleç değişkenlerini kullanırken bu anahtar sözcüğü kullanın.

değer bağlı sunucuda yürütülen modülün OUTPUT olarak tanımlanırsa, OLE DB sağlayıcısı tarafından gerçekleştirilen ilgili @parameter yapılan tüm değişiklikler modülün yürütülmesinin sonunda değişkenine geri kopyalanır.

OUTPUT parametreleri kullanılıyorsa ve amaç çağıran toplu iş veya modül içindeki diğer deyimlerdeki dönüş değerlerini kullanmaksa, parametrenin değeri @parameter = @variablegibi bir değişken olarak geçirilmelidir. Modülde OUTPUT parametresi olarak tanımlanmayan bir parametre için OUTPUT belirterek bir modülü yürütemezsiniz. Sabitler OUTPUTkullanılarak modüle geçirilemiyor; return parametresi bir değişken adı gerektirir. Değişkenin veri türü bildirilmeli ve yordamı yürütmeden önce bir değer atanmalıdır.

EXECUTE bir uzak saklı yordamda veya bağlı bir sunucuda geçiş komutu yürütmek için kullanıldığında, OUTPUT parametreler büyük nesne (LOB) veri türlerinden biri olamaz.

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

DEFAULT

Modülde tanımlandığı gibi parametresinin varsayılan değerini sağlar. Modül, tanımlı varsayılanı olmayan bir parametre için bir değer beklediğinde ve bir parametre eksikse veya DEFAULT anahtar sözcüğü belirtildiğinde bir hata oluşur.

@string_variable

Yerel değişkenin adı. @string_variable herhangi bir char, varchar, ncharveya nvarchar veri türü olabilir. Bunlar (maksimum) veri türlerini içerir.

[N]'tsql_string'

Sabit bir dize. tsql_string herhangi bir nvarchar veya varchar veri türü olabilir. N dahil edilirse, dize nvarchar veri türü olarak yorumlanır.

AS context_specification

deyiminin yürütüldiği bağlamı belirtir.

LOGIN

Kimliğine bürünülecek bağlamın bir oturum açma işlemi olduğunu belirtir. Kimliğe bürünme kapsamı sunucudur.

USER

Kimliğine bürünülecek bağlamın geçerli veritabanındaki bir kullanıcı olduğunu belirtir. Kimliğe bürünme kapsamı geçerli veritabanıyla sınırlıdır. Bir veritabanı kullanıcısına bağlam anahtarı, o kullanıcının sunucu düzeyindeki izinlerini devralamaz.

Important

Veritabanı kullanıcısına bağlam anahtarı etkin olsa da, veritabanı dışındaki kaynaklara erişme girişimleri deyiminin başarısız olmasına neden olur. Buna USE <database> deyimleri, dağıtılmış sorgular ve üç bölümlü veya dört bölümlü tanımlayıcılar kullanarak başka bir veritabanına başvuran sorgular dahildir.

'name'

Geçerli bir kullanıcı veya oturum açma adı. ad bağımsız değişkeni, sırasıyla sysadmin sabit sunucu rolünün üyesi olmalı veya sys.database_principals veya sys.server_principals'da sorumlu olarak bulunmalıdır.

Bu bağımsız değişken NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServiceveya NT AUTHORITY\LocalSystemgibi yerleşik bir hesap olamaz.

Daha fazla bilgi için bu makalenin devamında yer alan Kullanıcı veya Oturum Açma Adı Belirtme bakın.

[N]'command_string'

Bağlı sunucuya geçirilecek komutu içeren sabit dize. N dahil edilirse, dize nvarchar veri türü olarak yorumlanır.

[?]

<arg-list> deyiminde kullanılan geçiş komutlarının EXECUTE ('...', <arg-list>) AT <linkedsrv> değerlerin sağlandığı parametreleri gösterir.

linked_server_name

command_stringlinked_server_name için yürütüldüğünü ve varsa sonuçların istemciye döndürüldüğünü belirtir. linked_server_name yerel sunucuda var olan bir bağlı sunucu tanımına başvurmalıdır. Bağlı sunucular sp_addlinkedserverkullanılarak tanımlanır.

  • WITH <execute_option>

    Olası yürütme seçenekleri. RESULT SETS seçenekleri bir INSERT...EXECUTE deyiminde belirtilemiyor.

DATA_SOURCE data_source_name

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler.

command_stringdata_source_name için yürütüldüğünü ve varsa sonuçların istemciye döndürüldüğünü belirtir. data_source_name veritabanındaki mevcut bir EXTERNAL DATA SOURCE tanımına başvurmalıdır. Yalnızca SQL Server'ı işaret eden veri kaynakları desteklenir. Ayrıca işlem havuzuna, veri havuzuna veya depolama havuzuna işaret eden SQL Server Büyük Veri Kümesi veri kaynakları için de desteklenir. Veri kaynakları, CREATE EXTERNAL DATA SOURCEkullanılarak tanımlanır.

  • WITH <execute_option>

    Olası yürütme seçenekleri. RESULT SETS seçenekleri bir INSERT...EXECUTE deyiminde belirtilemiyor.

    Term Definition
    RECOMPILE Modül yürütüldükten sonra yeni bir planın derlenip kullanılmasını ve atılması için zorlar. Modül için mevcut bir sorgu planı varsa, bu plan önbellekte kalır.

    Sağladığınız parametre atipikse veya veriler önemli ölçüde değiştiyse bu seçeneği kullanın. Bu seçenek genişletilmiş saklı yordamlar için kullanılmaz. Pahalı olduğundan bu seçeneği tedbirli kullanmanızı öneririz.

    Not:WITH RECOMPILE söz dizimi kullanan bir saklı yordamı çağırırken OPENDATASOURCE kullanamazsınız. Dört bölümlü nesne adı belirtildiğinde WITH RECOMPILE seçeneği yoksayılır.

    Not:RECOMPILE yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevlerle desteklenmez. Yeniden derlemeniz gerekiyorsa sp_recompilekullanın.
    RESULT SETS UNDEFINED Bu seçenek, varsa hangi sonuçların döndürülür ve tanım sağlanmadığını garanti eder. Sonuç döndürülürse veya sonuç döndürülmezse deyimi hatasız olarak yürütülür. RESULT SETS UNDEFINED, result_sets_option sağlanmayan varsayılan davranıştır.

    Yorumlanan skaler kullanıcı tanımlı işlevler ve yerel olarak derlenmiş skaler kullanıcı tanımlı işlevler için bu seçenek işlevsel değildir çünkü işlevler hiçbir zaman sonuç kümesi döndürmez.

    için geçerlidir: SQL Server 2012 (11.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
    RESULT SETS NONE EXECUTE deyiminin herhangi bir sonuç döndürmediğini garanti eder. Herhangi bir sonuç döndürülürse toplu iş durduruldu.

    Yorumlanan skaler kullanıcı tanımlı işlevler ve yerel olarak derlenmiş skaler kullanıcı tanımlı işlevler için bu seçenek işlevsel değildir çünkü işlevler hiçbir zaman sonuç kümesi döndürmez.

    için geçerlidir: SQL Server 2012 (11.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
    <result_sets_definition> sonucun result_sets_definitionbelirtildiği şekilde geri gelmesini garanti eder. Birden çok sonuç kümesi döndüren deyimler için birden çok result_sets_definition bölümü sağlayın. Her result_sets_definition virgülle ayırarak parantez içine alın. Daha fazla bilgi için bu makalenin sonraki <result_sets_definition> bakın.

    İşlevler hiçbir zaman sonuç kümesi döndürmediğinden, bu seçenek her zaman yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için bir hatayla sonuçlanır.

    için geçerlidir: SQL Server 2012 (11.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

    <result_sets_definition> yürütülen deyimler tarafından döndürülen sonuç kümelerini açıklar. result_sets_definition yan tümceleri şu anlama sahiptir:

    Term Definition
    { column_name data_type
    [ DERLEME collation_name ]
    [NULL | NOT NULL] }
    Aşağıdaki tabloya bakın.
    db_name Tablo, görünüm veya tablo değerli işlevini içeren veritabanının adı.
    schema_name Tablo, görünüm veya tablo değerli işlevin sahibi olan şemanın adı.
    table_name | view_name | table_valued_function_name Döndürülen sütunların adlı tablo, görünüm veya tablo değerli işlevde belirtilen sütunlar olduğunu belirtir. Tablo değişkenleri, geçici tablolar ve eş anlamlılar AS nesne söz diziminde desteklenmez.
    TÜRÜ [ schema_name. ]table_type_name Döndürülen sütunların tablo türünde belirtilen sütunlar olduğunu belirtir.
    XML IÇIN OLDUĞU GIBI EXECUTE deyimi tarafından çağrılan deyiminden veya saklı yordamdan gelen XML sonuçlarının, SELECT ... FOR XML ... deyimi tarafından üretilmiş gibi biçime dönüştürüldüğünü belirtir. Özgün deyimdeki tür yönergelerinden tüm biçimlendirmeler kaldırılır ve döndürülen sonuçlar hiçbir tür yönergesi belirtilmemiş gibi olur. AS FOR XML yürütülen deyimden veya saklı yordamdan XML olmayan tablosal sonuçları XML'ye dönüştürmez.
    Term Definition
    column_name Her sütunun adları. Sütun sayısı sonuç kümesinden farklıysa bir hata oluşur ve toplu işlem durduruldu. Bir sütunun adı sonuç kümesinden farklıysa, döndürülen sütun adı tanımlanan ada ayarlanır.
    data_type Her sütunun veri türleri. Veri türleri farklıysa, tanımlı veri türüne örtük bir dönüştürme gerçekleştirilir. Dönüştürme başarısız olursa toplu iş durduruldu
    HARMANLAMA collation_name Her sütunun harmanlaması. Harmanlama uyuşmazlığı varsa örtük harmanlama denener. Bu başarısız olursa toplu iş durduruldu.
    NULL | NOT NULL Her sütunun null atanabilirliği. Tanımlanan null atanabilirlik NOT NULL ve döndürülen veriler null içeriyorsa bir hata oluşur ve toplu işlem durduruldu. Belirtilmezse, varsayılan değer ANSI_NULL_DFLT_ON ve ANSI_NULL_DFLT_OFF seçeneklerinin ayarına uygundur.

    Yürütme sırasında döndürülen gerçek sonuç kümesi, aşağıdaki yollardan biriyle WITH RESULT SETS yan tümcesi kullanılarak tanımlanan sonuçtan farklı olabilir: sonuç kümesi sayısı, sütun sayısı, sütun adı, null atanabilirlik ve veri türü. Sonuç kümelerinin sayısı farklıysa bir hata oluşur ve toplu işlem durduruldu.

Remarks

Parametreler değer kullanılarak veya@parameter_namedeğer kullanılarak sağlanabilir. Parametre bir işlemin parçası değildir; bu nedenle, daha sonra geri alınan bir işlemde bir parametre değiştirilirse, parametrenin değeri önceki değerine geri dönmez. Çağırana döndürülen değer her zaman modülün döndürdüğü zamandaki değerdir.

İç içe yerleştirme, bir modül başka bir modül çağırdığında veya ortak dil çalışma zamanı (CLR) modülüne, kullanıcı tanımlı türe veya toplamaya başvurarak yönetilen kodu yürüttüğünde gerçekleşir. İç içe yerleştirme düzeyi, çağrılan modül veya yönetilen kod başvurusu yürütmeyi başlattığında artar ve çağrılan modül veya yönetilen kod başvurusu tamamlandığında azalır. en fazla 32 iç içe yerleştirme düzeyinin aşılması, tam çağrı zincirinin başarısız olmasına neden olur. Geçerli iç içe yerleştirme düzeyi @@NESTLEVEL sistem işlevinde depolanır.

Uzak saklı yordamlar ve genişletilmiş saklı yordamlar bir işlem kapsamında olmadığından (BEGIN DISTRIBUTED TRANSACTION deyimi içinde verilmediği veya çeşitli yapılandırma seçenekleriyle kullanıldığında), bunlara çağrılar aracılığıyla yürütülen komutlar geri alınamaz. Daha fazla bilgi için bkz. Sistem saklı yordamları ve BEGIN DISTRIBUTED TRANSACTION.

İmleç değişkenlerini kullandığınızda, imleç değişkenine ayrılmış bir imleç değişkeni ileten bir yordam yürütürseniz bir hata oluşur.

Deyim toplu işteki ilk anahtar sözcükse modülleri yürütürken EXECUTE anahtar sözcüğünü belirtmeniz gerekmez.

CLR saklı yordamlarına özgü daha fazla bilgi için bkz. CLR Saklı Yordamları.

Saklı yordamlarla EXECUTE kullanma

Deyimi toplu işteki ilk yordam olduğunda saklı yordamları yürütürken EXECUTE anahtar sözcüğünü belirtmeniz gerekmez.

SQL Server sistem saklı yordamları sp_karakterleriyle başlar. Fiziksel olarak Kaynak Veritabanıdepolanır, ancak mantıksal olarak her sistemin ve kullanıcı tanımlı veritabanının sys şemasında görünürler. Sistem saklı yordamını toplu olarak veya kullanıcı tanımlı saklı yordam veya işlev gibi bir modülün içinde yürütürken, saklı yordam adını sys şema adıyla nitelemenizi öneririz.

SQL Server sistemi genişletilmiş saklı yordamları xp_karakterleriyle başlar ve bunlar master veritabanının dbo şemasında yer alır. Sistem genişletilmiş saklı yordamını toplu olarak veya kullanıcı tanımlı saklı yordam veya işlev gibi bir modülün içinde yürütürken, saklı yordam adını master.dboile nitelemenizi öneririz.

Kullanıcı tanımlı saklı yordamı toplu olarak veya kullanıcı tanımlı saklı yordam veya işlev gibi bir modülün içinde yürütürken, saklı yordam adını şema adıyla nitelemenizi öneririz. Kullanıcı tanımlı saklı yordamı sistem saklı yordamıyla aynı ada sahip olarak adlandırmanızı önermeyiz. Saklı yordamları yürütme hakkında daha fazla bilgi için bkz. Saklı yordam yürütme.

Karakter dizesi ile EXECUTE kullanma

SQL Server'da varchar(max) ve nvarchar(max) veri türleri, karakter dizelerinin en fazla 2 gigabayt veri olmasını sağlayan belirtilebilir.

Veritabanı bağlamındaki değişiklikler yalnızca EXECUTE deyiminin sonuna kadar sürer. Örneğin, aşağıdaki deyimdeki EXECUTE çalıştırıldıktan sonra veritabanı bağlamı master.

USE master;

EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');

Bağlam değiştirme

dinamik deyiminin yürütme bağlamını değiştirmek için AS { LOGIN | USER } = '<name>' yan tümcesini kullanabilirsiniz. Bağlam anahtarı EXECUTE ('string') AS <context_specification>olarak belirtildiğinde, bağlam anahtarının süresi yürütülen sorgunun kapsamıyla sınırlıdır.

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

AS { LOGIN | USER } = '<name>''de belirtilen kullanıcı veya oturum açma adı sırasıyla sys.database_principals veya sys.server_principals'da sorumlu olarak bulunmalıdır, aksi durumda deyimi başarısız olur. Ayrıca, sorumlu üzerinde IMPERSONATE izinleri verilmelidir. Çağıran veritabanı sahibi veya sysadmin sabit sunucu rolünün üyesi değilse, kullanıcı bir Windows grup üyeliği aracılığıyla SQL Server veritabanına veya örneğine erişirken bile sorumlunun mevcut olması gerekir. Örneğin, aşağıdaki koşulları varsayın:

  • CompanyDomain\SQLUsers grubunun Sales veritabanına erişimi vardır.

  • CompanyDomain\SqlUser1, SQLUsers üyesidir ve bu nedenle Sales veritabanına örtük erişime sahiptir.

CompanyDomain\SqlUser1 SQLUsers grubu üyeliği aracılığıyla veritabanına erişimi olsa da, EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' veritabanında sorumlu olarak bulunmadığından CompanyDomain\SqlUser1 deyimi başarısız olur.

En iyi yöntemler

Deyim veya modülde tanımlanan işlemleri gerçekleştirmek için gereken en düşük ayrıcalıklara sahip bir oturum açma veya kullanıcı belirtin. Örneğin, yalnızca veritabanı düzeyinde izinler gerekiyorsa, sunucu düzeyinde izinlere sahip bir oturum açma adı belirtmeyin. Alternatif olarak, bu izinler gerekli olmadıkça veritabanı sahibi hesabı belirtmeyin.

Permissions

EXECUTE deyimini çalıştırmak için izinler gerekli değildir. Ancak, EXECUTE dizesinde başvurulan güvenli hale getirilebilir öğeler üzerinde izinler gereklidir. Örneğin, dize bir INSERT deyimi içeriyorsa, EXECUTE deyiminin çağıranın hedef tabloda INSERT izni olmalıdır. EXECUTE deyimi bir modüle dahil olsa bile EXECUTE deyimiyle karşılaşıldığında izinler denetleniyor.

Veritabanı Altyapısı'nın modülde başvuruda bulunan nesneler üzerindeki izinleri nasıl değerlendirdiğini, çağıran nesnelerle başvuruda bulunan nesneler arasında var olan sahiplik zincirine bağlıdır.

EXECUTE modül izinleri, modülün sahibine varsayılan olarak atanır ve bu izinler diğer kullanıcılara aktarılabilir. Bir dizeyi yürüten bir modül çalıştırıldığında, izinler modülü oluşturan kullanıcı bağlamında değil, modülü yürüten kullanıcının bağlamında denetlenür. Ancak, çağrılan modüle ve çağrılan modüle aynı kullanıcı sahipse, ikinci modül için EXECUTE izin denetimi gerçekleştirilmez.

Modül diğer veritabanı nesnelerine erişiyorsa, modülde EXECUTE izniniz olduğunda ve aşağıdaki koşullardan biri doğru olduğunda yürütme başarılı olur:

  • Modül EXECUTE AS USER veya EXECUTE AS SELFolarak işaretlenir ve modül sahibi başvuruda bulunan nesne üzerinde ilgili izinlere sahiptir. Modül içindeki kimliğe bürünme hakkında daha fazla bilgi için bkz. EXECUTE AS yan tümcesi.

  • Modül EXECUTE AS CALLERolarak işaretlenir ve nesne üzerinde ilgili izinlere sahipsiniz.

  • Modül EXECUTE AS <user_name>olarak işaretlenir ve <user_name> nesne üzerinde ilgili izinlere sahiptir.

Bağlam değiştirme izinleri

Bir oturum açma EXECUTE AS belirtmek için, çağıranın belirtilen oturum açma adı üzerinde IMPERSONATE izinlerine sahip olması gerekir. Bir veritabanı kullanıcısının EXECUTE AS belirtmek için, çağıranın belirtilen kullanıcı adında IMPERSONATE izinlerine sahip olması gerekir. Hiçbir yürütme bağlamı belirtilmediğinde veya EXECUTE AS CALLER belirtildiğinde, IMPERSONATE izinleri gerekli değildir.

Örnekler: SQL Server

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Tek bir parametre geçirmek için EXECUTE kullanma

uspGetEmployeeManagers AdventureWorks2025 veritabanındaki saklanan prosedür bir parametre (@EmployeeID). Aşağıdaki örnekler, parametre değeri olarak uspGetEmployeeManagers ile Employee ID 6 saklı yordamı yürütür.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

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

EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Aşağıdaki, bir toplu işteki ilk deyim veya sqlcmd betiği ise gerekli değildir.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

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

B. Birden çok parametre kullanma

Aşağıdaki örnek, AdventureWorks2025 veritabanında saklanan prosedürü çalıştırır spGetWhereUsedProductID . İki parametre geçirir: ilk parametre bir ürün kimliği (819) ve ikinci parametre @CheckDatedatetime değeridir.

DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();

EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

C. Değişkenle EXECUTE 'tsql_string' kullanma

Aşağıdaki örnekte, EXECUTE değişken içeren dinamik olarak oluşturulmuş dizeleri nasıl işlediği gösterilmektedir. Bu örnek, tables_cursor veritabanındaki tüm kullanıcı tanımlı tabloların listesini tutmak için AdventureWorks2025 imlecini oluşturur ve tablolardaki tüm dizinleri yeniden oluşturmak için bu listeyi kullanır.

DECLARE tables_cursor CURSOR
    FOR SELECT s.name, t.name FROM sys.objects AS t
    INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
    WHERE t.type = 'U';

OPEN tables_cursor;

DECLARE @schemaname AS sysname;
DECLARE @tablename AS 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;

D. Uzak saklı yordamla EXECUTE kullanma

Aşağıdaki örnek, uspGetEmployeeManagers saklı yordamını SQLSERVER1 uzak sunucuda yürütür ve @retstat'de başarıyı veya başarısızlığı gösteren dönüş durumunu depolar.

DECLARE @retstat AS INT;

EXECUTE
    @retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
    @BusinessEntityID = 6;

E. Saklı yordam değişkeniyle EXECUTE kullanma

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

DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';

EXECUTE @proc_name;

F. DEFAULT 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, çağrıda hiçbir değer geçirilmediğinde veya varsayılan belirtildiğinde ilk ve üçüncü parametreler için bu varsayılanlar eklenir. DEFAULT anahtar sözcüğünü çeşitli yollarla kullanabileceğine dikkat edin.

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_Defaults saklı yordamı birçok birleşimde yürütülebilir.

-- 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. AT linked_server_name ile EXECUTE kullanma

Aşağıdaki örnek bir komut dizesini uzak sunucuya geçirir. SQL Server'ın başka bir örneğine işaret eden bağlı bir sunucu SeattleSales oluşturur ve bu bağlantılı sunucuya karşı bir DDL deyimi (CREATE TABLE) yürütür.

EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO

EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO

H. RECOMPILE ILE EXECUTE KULLANMA

Aşağıdaki örnek, Proc_Test_Defaults saklı yordamı yürütür ve modül yürütüldükten sonra yeni bir sorgu planını derlenecek, kullanılacak ve atılacak şekilde zorlar.

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

I. Kullanıcı tanımlı bir işlevle EXECUTE kullanma

Aşağıdaki örnek, AdventureWorks2025 veritabanında skaler kullanıcı tanımlı fonksiyonu çalıştırır ufnGetSalesOrderStatusText . İşlev tarafından döndürülen değeri depolamak için @returnstatus değişkenini kullanır. işlevi, @Statusbir giriş parametresi bekler. Bu, tinyint veri türü olarak tanımlanır.

DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;

EXECUTE
    @returnstatus = dbo.ufnGetSalesOrderStatusText
    @Status = 2;

PRINT @returnstatus;
GO

J. Bağlı bir sunucudaki Oracle veritabanını sorgulamak için EXECUTE kullanma

Aşağıdaki örnek, uzak Oracle sunucusunda birkaç SELECT deyimi yürütür. Örnek, Oracle sunucusunu bağlı sunucu olarak ekleyip bağlantılı sunucu oturum açma bilgileri oluşturarak başlar.

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

EXECUTE sp_addlinkedsrvlogin
    @rmtsrvname = 'ORACLE',
    @useself = 'false',
    @locallogin = NULL,
    @rmtuser = 'scott',
    @rmtpassword = 'tiger';

EXECUTE sp_serveroption 'ORACLE', 'rpc out', true;
GO

-- Execute several statements on the linked Oracle server.
EXECUTE ('SELECT * FROM scott.emp') AT ORACLE;
GO

EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO

DECLARE @v AS INT;
SET @v = 7902;

EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO

K. Bağlamı başka bir kullanıcıya değiştirmek için EXECUTE AS USER kullanma

Aşağıdaki örnek, bir tablo oluşturan bir Transact-SQL dizesi yürütür ve çağıranın deyiminin yürütme bağlamını AS USERolarak değiştirmek için User1 yan tümcesini belirtir. Veritabanı Altyapısı, deyimi çalıştırıldığında User1 izinlerini denetler. User1 veritabanında kullanıcı olarak bulunmalıdır ve Sales şemasında tablo oluşturma iznine sahip olmalıdır, aksi durumda deyimi başarısız olur.

EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO

L. EXECUTE ve AT linked_server_name ile parametre kullanma

Aşağıdaki örnek, bir parametre için soru işareti (?) yer tutucusu kullanarak bir komut dizesini uzak sunucuya geçirir. Örnek, SQL Server'ın başka bir örneğine işaret eden bir bağlı sunucu SeattleSales oluşturur ve bu bağlantılı sunucuda bir SELECT deyimi yürütür. SELECT deyimi, deyiminden sonra sağlanan ProductID parametresi (952) için yer tutucu olarak soru işaretini kullanır.

-- Setup the linked server.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO

-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
    FROM AdventureWorks2022.Production.Product
    WHERE ProductID = ? ', 952) AT SeattleSales;
GO

M. Tek bir sonuç kümesini yeniden tanımlamak için EXECUTE kullanma

için geçerlidir: SQL Server 2012 (11.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Önceki örneklerden bazıları yedi sütun döndüren EXECUTE dbo.uspGetEmployeeManagers 6; yürütüldü. Aşağıdaki örnekte, dönen sonuç kümesinin adlarını ve veri türlerini değiştirmek için WITH RESULT SET söz diziminin kullanılması gösterilmektedir.

EXECUTE 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ç kümesini yeniden tanımlamak için EXECUTE kullanma

için geçerlidir: SQL Server 2012 (11.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Birden fazla sonuç kümesi döndüren bir deyimi yürütürken, beklenen her sonuç kümesini tanımlayın. aşağıdaki AdventureWorks2025 örneği, iki sonuç kümesi döndüren bir yordam oluşturur. Ardından yordam, WITH RESULT SETS yan tümcesi kullanılarak ve iki sonuç kümesi tanımı belirterek yürütülür.

--Create the procedure
CREATE PROCEDURE 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
     INNER JOIN Sales.SalesOrderDetail AS S
         ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO

-- Execute the procedure
EXECUTE Production.ProductList '%tire%' WITH RESULT SETS
(
    -- first result set definition starts here
    (ProductID INT, [Name] NAME, ListPrice MONEY)
    -- comma separates result set definitions
    ,
    -- second result set definition starts here
    ([Name] NAME, NumberOfOrders INT)
);

O. Uzak SQL Server'ı sorgulamak için AT DATA_SOURCE data_source_name ile EXECUTE kullanma

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler.

Aşağıdaki örnek bir komut dizesini SQL Server örneğine işaret eden bir dış veri kaynağına geçirir.

EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO

P. SQL Server Büyük Veri Kümesi'nde işlem havuzunu sorgulamak için AT DATA_SOURCE data_source_name ile EXECUTE kullanma

için geçerlidir: SQL Server 2019 (15.x).

Aşağıdaki örnek, SQL Server Büyük Veri Kümesi'ndeki bir işlem havuzuna işaret eden bir komut dizesini dış veri kaynağına geçirir. Örnek, SQL Server Büyük Veri Kümesindeki bir işlem havuzuna SqlComputePool bir veri kaynağı oluşturur ve veri kaynağına karşı bir SELECT deyimi yürütür.

CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');

EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO

Q. SQL Server Büyük Veri Kümesi'nde veri havuzunu sorgulamak için AT DATA_SOURCE data_source_name ile EXECUTE kullanma

için geçerlidir: SQL Server 2019 (15.x).

Aşağıdaki örnek, SQL Server Büyük Veri Kümesi'ndeki (İVB) işlem havuzuna işaret eden bir komut dizesini dış veri kaynağına geçirir. Örnek, İVB'deki bir veri havuzuna SqlDataPool bir veri kaynağı oluşturur ve veri kaynağına karşı bir SELECT deyimi yürütür.

CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');

EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO

R. SQL Server Büyük Veri Kümesi'nde depolama havuzunu sorgulamak için AT DATA_SOURCE data_source_name ile EXECUTE kullanma

için geçerlidir: SQL Server 2019 (15.x).

Aşağıdaki örnek, SQL Server Büyük Veri Kümesindeki işlem havuzuna işaret eden bir komut dizesini dış veri kaynağına geçirir. Örnek, SQL Server Büyük Veri Kümesindeki bir veri havuzuna SqlStoragePool bir veri kaynağı oluşturur ve veri kaynağına karşı bir SELECT deyimi yürütür.

CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');

EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO

Örnekler: Azure Synapse Analytics

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

Y: Temel yordam yürütme

Saklı yordam yürütme:

EXECUTE proc1;

Çalışma zamanında belirlenen ada sahip bir saklı yordamı çağır:

EXECUTE ('EXECUTE ' + @var);

Saklı yordamı saklı yordamın içinden çağır:

CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;

B: Dizeleri yürütme

SQL dizesi yürütme:

EXECUTE ('SELECT * FROM sys.types');

İç içe dize yürütme:

EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');

Bir dize değişkeni yürüt:

DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';

EXECUTE (@stringVar);

C: Parametrelerle yordamlar

Aşağıdaki örnek parametrelerle bir yordam oluşturur ve yordamı yürütmenin üç yolunu gösterir:

CREATE PROCEDURE ProcWithParameters (
    @name NVARCHAR (50),
    @color NVARCHAR (15)
)
AS
SELECT ProductKey,
       EnglishProductName,
       Color
FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @namef
      AND Color = @color;
GO

Konumsal parametreleri kullanarak yürütme:

EXECUTE ProcWithParameters N'%arm%', N'Black';

Adlandırılmış parametreleri sırayla kullanarak yürütür:

EXECUTE ProcWithParameters
    @name = N'%arm%',
    @color = N'Black';

Adlandırılmış parametreleri sıra dışı kullanarak yürütür:

EXECUTE ProcWithParameters
    @color = N'Black',
    @name = N'%arm%';
GO