Megosztás a következőn keresztül:


VÉGREHAJTSA (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Parancssztringet vagy karaktersztringet hajt végre egy Transact-SQL kötegen belül, vagy a következő modulok egyikét: rendszer által tárolt eljárás, felhasználó által definiált tárolt eljárás, CLR tárolt eljárás, skaláris értékű felhasználó által definiált függvény vagy kiterjesztett tárolt eljárás. A EXEC vagy EXECUTE utasítással átmenő parancsokat küldhet a csatolt kiszolgálóknak. Emellett a sztringek vagy parancsok végrehajtásának környezete explicit módon is beállítható. Az eredményhalmaz metaadatai a WITH RESULT SETS beállításaival határozhatók meg.

Important

Mielőtt egy karaktersztringgel meghívja EXECUTE, ellenőrizze a karaktersztringet. Soha ne hajtsa végre a nem ellenőrzött felhasználói bemenetből létrehozott parancsot.

Transact-SQL szintaxis konvenciói

Syntax

Az alábbi kódblokk az SQL Server 2019 (15.x) és újabb verzióinak szintaxisát mutatja be. Másik lehetőségként tekintse meg szintaxist az SQL Server 2017-ben és a korábbi.

Az SQL Server 2019 és újabb verzióinak szintaxisa.

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

Az alábbi kódblokk az SQL Server 2017 (14.x) és a korábbi verziók szintaxisát mutatja be. Másik lehetőségként tekintse meg szintaxist az SQL Server 2019.

Az SQL Server 2017 és korábbi verzióinak szintaxisa.

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

Az OLTP In-Memory szintaxisa.

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

Az Azure SQL Database szintaxisa.

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

Az Azure Synapse Analytics és a párhuzamos adattárház szintaxisa.

-- 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 ] )
[ ; ]

A Microsoft Fabric szintaxisa.

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

Nem kötelező egész változó, amely egy modul visszatérési állapotát tárolja. Ezt a változót deklarálni kell a kötegben, a tárolt eljárásban vagy a függvényben, mielőtt egy EXECUTE utasításban használták volna.

Ha skaláris értékű, felhasználó által definiált függvény meghívására szolgál, a @return_status változó bármilyen skaláris adattípusú lehet.

module_name

A meghívandó tárolt eljárás vagy skaláris értékű felhasználó által definiált függvény teljes vagy nem minősített neve. A modulneveknek meg kell felelniük azonosítókszabályainak. A kiterjesztett tárolt eljárások neve mindig megkülönbözteti a kis- és nagybetűket, függetlenül a kiszolgáló rendezésétől.

Egy másik adatbázisban létrehozott modul akkor hajtható végre, ha a modult futtató felhasználó a modul tulajdonosa, vagy rendelkezik a megfelelő engedéllyel ahhoz, hogy végrehajtsa azt az adatbázisban. Egy modul egy sql servert futtató másik kiszolgálón is végrehajtható, ha a modult futtató felhasználó rendelkezik a megfelelő engedéllyel a kiszolgáló használatára (távelérés), és végrehajthatja a modult az adatbázisban. Ha egy kiszolgálónév van megadva, de nincs megadva adatbázisnév, az SQL Server adatbázismotor a modult a felhasználó alapértelmezett adatbázisában keresi.

;number

Nem kötelező egész szám, amely az azonos nevű eljárások csoportosítására szolgál. Ez a paraméter nem használható kiterjesztett tárolt eljárásokhoz.

Note

Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

További információ az eljáráscsoportokról: CREATE PROCEDURE.

@module_name_var

Egy helyileg definiált változó neve, amely egy modulnevet jelöl.

Ez lehet olyan változó, amely egy natívan lefordított, skaláris, felhasználó által definiált függvény nevét tartalmazza.

@parameter

A modulban meghatározott module_nameparamétere. A paraméternevek előtt az at sign (@) értéknek kell szerepelnie. Az @parameter_name = érték űrlap használatakor a paraméterneveket és az állandókat nem kell a modulban definiált sorrendben megadni. Ha azonban a @parameter_name = érték űrlapot használja bármely paraméterhez, akkor azt minden további paraméterhez használni kell.

Alapértelmezés szerint a paraméterek null értékűek.

value

A modulnak vagy az átmenő parancsnak átadni kívánt paraméter értéke. Ha a paraméternevek nincsenek megadva, a paraméterértékeket a modulban meghatározott sorrendben kell megadni.

A csatolt kiszolgálókon futó átmenő parancsok végrehajtásakor a paraméterértékek sorrendje a csatolt kiszolgáló OLE DB-szolgáltatójától függ. A legtöbb OLE DB-szolgáltató balról jobbra köti az értékeket a paraméterekhez.

Ha egy paraméter értéke objektumnév, karaktersztring, vagy adatbázisnévvel vagy sémanévvel van minősítve, a teljes nevet idézőjelek közé kell foglalni. Ha egy paraméter értéke kulcsszó, a kulcsszót idézőjelek közé kell foglalni.

Ha egyetlen olyan szót ad át, amely nem @kezdődik, akkor az nem idézőjelek közé kerül (például ha elfelejti @ paraméternéven), a szó a hiányzó idézőjelek ellenére nvarchar sztringként lesz kezelve.

Ha a modulban alapértelmezett érték van megadva, a felhasználó paraméter megadása nélkül is végrehajthatja a modult.

Az alapértelmezett érték NULLis lehet. A moduldefiníció általában azt a műveletet határozza meg, amelyet akkor kell végrehajtani, ha egy paraméter értéke NULL.

@variable

A paramétert vagy visszatérési paramétert tároló változó.

OUTPUT

Megadja, hogy a modul vagy a parancssztring egy paramétert ad vissza. A modul vagy a parancssztring egyező paraméterét a OUTPUTkulcsszóval is létre kell hozni. Ezt a kulcsszót akkor használja, ha kurzorváltozókat használ paraméterekként.

Ha egy csatolt kiszolgálón végrehajtott modul OUTPUT definiálva van, az OLE DB-szolgáltató által végrehajtott megfelelő @parameter módosításai vissza lesznek másolva a változóba a modul végrehajtása végén.

Ha OUTPUT paramétereket használ, és a szándék az, hogy a visszaadott értékeket a hívó kötegben vagy modulban lévő más utasításokban használja, a paraméter értékét változóként kell átadni, például @parameter = @variable. Nem hajthat végre modult olyan paraméter OUTPUT megadásával, amely nem OUTPUT paraméterként van definiálva a modulban. Az állandók nem adhatók át a modulnak a OUTPUT; a visszatérési paraméterhez változónév szükséges. Az eljárás végrehajtása előtt deklarálni kell a változó adattípusát és egy hozzárendelt értéket.

Ha EXECUTE távoli tárolt eljáráson keresztül, vagy egy átmenő parancs csatolt kiszolgálón való végrehajtására szolgál, OUTPUT paraméterek nem lehetnek a nagy objektum (LOB) adattípusok egyikének sem.

A visszatérési paraméterek bármilyen típusúak lehetnek, kivéve a LOB adattípusokat.

DEFAULT

A modulban meghatározott paraméter alapértelmezett értékét adja meg. Ha a modul olyan paraméter értékét várja, amely nem rendelkezik definiált alapértelmezett értékkel, és hiányzik egy paraméter, vagy meg van adva a DEFAULT kulcsszó, hiba történik.

@string_variable

Egy helyi változó neve. @string_variable lehet bármilyen karakter, varchar, ncharvagy nvarchar adattípus. Ezek közé tartozik a (maximális) adattípus.

[N]'tsql_string'

Állandó sztring. tsql_string lehet bármilyen nvarchar vagy varchar adattípus. Ha a N szerepel, a sztring nvarchar adattípusként lesz értelmezve.

MINT context_specification

Meghatározza az utasítás végrehajtásának környezetét.

LOGIN

Megadja, hogy a megszemélyesítendő környezet egy bejelentkezés. A megszemélyesítés hatóköre a kiszolgáló.

USER

Megadja, hogy a megszemélyesítendő környezet az aktuális adatbázis felhasználója-e. A megszemélyesítés hatóköre az aktuális adatbázisra korlátozódik. Az adatbázis-felhasználóra való környezeti váltás nem örökli a felhasználó kiszolgálószintű engedélyeit.

Important

Bár a környezeti váltás az adatbázis-felhasználóra aktív, az adatbázison kívüli erőforrások elérésére tett kísérletek sikertelenséget okoznak. Ide tartoznak USE <database> utasítások, elosztott lekérdezések és olyan lekérdezések, amelyek egy másik adatbázisra hivatkoznak három- vagy négyrészes azonosítók használatával.

'name'

Érvényes felhasználónév vagy bejelentkezési név. A név argumentumnak a sysadmin rögzített kiszolgálói szerepkör tagjának kell lennie, vagy az sys.database_principals vagy sys.server_principalstagként kell lennie.

Ez az argumentum nem lehet beépített fiók, például NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicevagy NT AUTHORITY\LocalSystem.

További információ: Felhasználó vagy bejelentkezési név megadása a cikk későbbi részében.

[N]'command_string'

Állandó sztring, amely a csatolt kiszolgálónak továbbítandó parancsot tartalmazza. Ha a N szerepel, a sztring nvarchar adattípusként lesz értelmezve.

[?]

Azokat a paramétereket jelzi, amelyek értékeit az <arg-list> utasításban használt átmenő parancsok EXECUTE ('...', <arg-list>) AT <linkedsrv> adja meg.

linked_server_name ÉVESEN

Megadja, hogy a command_stringlinked_server_name hajtja végre, és ha van ilyen, az eredményeket visszaadja az ügyfélnek. linked_server_name hivatkoznia kell egy meglévő csatolt kiszolgáló definícióra a helyi kiszolgálón. A csatolt kiszolgálók sp_addlinkedserverhasználatával vannak definiálva.

  • WITH <execute_option>

    Lehetséges végrehajtási beállítások. A RESULT SETS beállítások nem adhatók meg INSERT...EXECUTE utasításban.

DATA_SOURCE data_source_name

A: SQL Server 2019 (15.x) és újabb verziókra vonatkozik.

Megadja, hogy a command_stringdata_source_name hajtja végre, és ha van ilyen, az eredményeket visszaadja az ügyfélnek. data_source_name az adatbázisban meglévő EXTERNAL DATA SOURCE definícióra kell hivatkoznia. Csak az SQL Serverre mutató adatforrások támogatottak. Emellett az SQL Server Big Data Cluster számítási készletre, adatkészletre vagy tárolókészletre mutató adatforrásai is támogatottak. Az adatforrások definiálása KÜLSŐ ADATFORRÁS LÉTREHOZÁSAhasználatával történik.

  • WITH <execute_option>

    Lehetséges végrehajtási beállítások. A RESULT SETS beállítások nem adhatók meg INSERT...EXECUTE utasításban.

    Term Definition
    RECOMPILE Új terv fordítására, használatára és elvetésére kényszeríti a modul végrehajtása után. Ha a modulhoz már létezik lekérdezési terv, ez a terv a gyorsítótárban marad.

    Ezt a beállítást akkor használja, ha a megadott paraméter atipikus, vagy ha az adatok jelentősen megváltoztak. Ez a beállítás nem használható kiterjesztett tárolt eljárásokhoz. Javasoljuk, hogy takarékosan használja ezt a lehetőséget, mert drága.

    Megjegyzés: Nem használhat WITH RECOMPILEOPENDATASOURCE szintaxist használó tárolt eljárás meghívásakor. A WITH RECOMPILE beállítás négyrészes objektumnév megadásakor figyelmen kívül lesz hagyva.

    Megjegyzés: aRECOMPILE natívan lefordított, skaláris, felhasználó által definiált függvények nem támogatják. Ha újrafordításra van szüksége, használja a sp_recompile.
    RESULT SETS UNDEFINED Ez a beállítás nem garantálja, hogy a rendszer milyen eredményeket ad vissza, ha vannak ilyenek, és nem ad meg definíciót. Az utasítás hiba nélkül fut, ha bármilyen eredményt ad vissza, vagy nem ad vissza eredményt. RESULT SETS UNDEFINED az alapértelmezett viselkedés, ha nincs megadva result_sets_option.

    A felhasználó által definiált skaláris függvények és natívan lefordított skaláris felhasználó által definiált függvények esetében ez a beállítás nem működik, mert a függvények soha nem adnak eredményhalmazt.

    A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók, valamint az Azure SQL Database.
    RESULT SETS NONE Garantálja, hogy a EXECUTE utasítás nem ad vissza eredményt. Ha bármilyen eredményt ad vissza, a köteg megszakad.

    A felhasználó által definiált skaláris függvények és natívan lefordított skaláris felhasználó által definiált függvények esetében ez a beállítás nem működik, mert a függvények soha nem adnak eredményhalmazt.

    A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók, valamint az Azure SQL Database.
    <result_sets_definition> Garantálja, hogy az eredmény a result_sets_definitionmegadott módon tér vissza. Több eredményhalmazt vissza adó utasítások esetén adjon meg több result_sets_definition szakaszt. Az egyes result_sets_definition zárójelekbe ágyazva, vesszővel elválasztva. További információ: <result_sets_definition> a cikk későbbi részében.

    Ez a beállítás mindig hibát eredményez a natívan lefordított, skaláris, felhasználó által definiált függvények esetében, mert a függvények soha nem adnak vissza eredményhalmazt.

    A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók, valamint az Azure SQL Database.

    <result_sets_definition> a végrehajtott utasítások által visszaadott eredményhalmazokat írja le. A result_sets_definition záradékainak jelentése a következő:

    Term Definition
    { column_name data_type
    [ ÖSSZEGYŰJTSD collation_name ]
    [NULL | NEM NULL] }
    Lásd a következő táblázatot.
    db_name A tábla, nézet vagy tábla értékű függvényt tartalmazó adatbázis neve.
    schema_name A tábla, nézet vagy tábla értékű függvényt birtokló séma neve.
    table_name | view_name | table_valued_function_name Megadja, hogy a visszaadott oszlopok a tábla, a nézet vagy a tábla értékének függvényben megadottak legyenek. A táblaváltozók, ideiglenes táblák és szinonimák nem támogatottak az AS objektumszintaxisában.
    MINT TYPE [ schema_name. ]table_type_name Megadja, hogy a visszaadott oszlopok a táblatípusban megadottak legyenek.
    AZ XML-HEZ HASONLÓAN Megadja, hogy a EXECUTE utasítás által meghívott utasítás vagy tárolt eljárás XML-eredményei olyan formátumba legyenek konvertálva, mintha egy SELECT ... FOR XML ... utasítás állította volna elő őket. Az eredeti utasításban szereplő típusirányelvek összes formázása el lesz távolítva, és a visszaadott eredmények úgy jelennek meg, mintha nem lett megadva a típusirányelmezet. AS FOR XML nem konvertálja a nem XML táblázatos eredményeket a végrehajtott utasításból vagy a tárolt eljárásból XML-fájllá.
    Term Definition
    column_name Az egyes oszlopok nevei. Ha az oszlopok száma eltér az eredményhalmaztól, hiba történik, és a köteg megszakad. Ha egy oszlop neve eltér az eredményhalmaztól, a visszaadott oszlopnév a megadott névre lesz állítva.
    data_type Az egyes oszlopok adattípusai. Ha az adattípusok eltérnek, implicit átalakítást hajtunk végre a definiált adattípusra. Ha az átalakítás sikertelen, a köteg megszakad
    COLLATION_NAME RENDEZÉSE Az egyes oszlopok rendezése. Ha nem egyezik a rendezés, implicit rendezést kísérel meg a rendszer. Ha ez nem sikerül, a köteg megszakad.
    NULL | NEM NULL Az egyes oszlopok nullabilitása. Ha a megadott nullhiba NOT NULL, és a visszaadott adatok null értéket tartalmaznak, hiba történik, és a köteg megszakad. Ha nincs megadva, az alapértelmezett érték megfelel a ANSI_NULL_DFLT_ON és ANSI_NULL_DFLT_OFF beállításainak.

    A végrehajtás során visszaadott tényleges eredményhalmaz eltérhet a WITH RESULT SETS záradékkal definiált eredménytől a következő módok egyikében: eredményhalmazok száma, oszlopok száma, oszlopnév, nullhiba és adattípus. Ha az eredményhalmazok száma eltér, hiba történik, és a köteg megszakad.

Remarks

A paramétereket érték vagy @parameter_name = értékhasználatával lehet megadni. A paraméter nem része tranzakciónak; ezért ha egy paraméter módosul egy később visszagördített tranzakcióban, a paraméter értéke nem áll vissza a korábbi értékre. A hívónak visszaadott érték mindig az az érték, amikor a modul visszatér.

A beágyazás akkor történik, ha az egyik modul meghív egy másikat, vagy felügyelt kódot hajt végre egy közös nyelvi futtatókörnyezeti (CLR) modulra, felhasználó által definiált típusra vagy összesítésre hivatkozva. A beágyazási szint növekszik, amikor a hívott modul vagy felügyelt kód referenciája elkezdi a végrehajtást, és ha a hívott modul vagy felügyelt kód referenciája befejeződik, csökken. A legfeljebb 32 beágyazási szint túllépése esetén a teljes híváslánc meghiúsul. Az aktuális beágyazási szint a @@NESTLEVEL rendszerfüggvényben van tárolva.

Mivel a távoli tárolt eljárások és a kiterjesztett tárolt eljárások nem tartoznak a tranzakció hatókörébe (kivéve, ha BEGIN DISTRIBUTED TRANSACTION utasításban vannak kiadva, vagy ha különböző konfigurációs beállításokat használnak), a hozzájuk intézett hívásokon keresztül végrehajtott parancsok nem állíthatók vissza. További információ: Rendszer által tárolt eljárások és BEGIN ELOSZTOTT TRANZAKCIÓ.

Ha kurzorváltozókat használ, ha olyan eljárást hajt végre, amely egy kurzorváltozóban halad át, és a kurzor hozzá van rendelve, hiba történik.

Nem kell megadnia a EXECUTE kulcsszót a modulok végrehajtásakor, ha az utasítás az első egy kötegben.

A CLR által tárolt eljárásokkal kapcsolatos további információkért lásd CLR tárolt eljárások.

AZ EXECUTE használata tárolt eljárásokkal

A tárolt eljárások végrehajtásakor nem kell megadnia a EXECUTE kulcsszót, ha az utasítás az első egy kötegben.

Az SQL Server rendszer által tárolt eljárásai a sp_karakterekkel kezdődnek. Fizikailag a erőforrás-adatbázistárolják őket, de logikailag minden rendszer- és felhasználó által definiált adatbázis sys sémájában jelennek meg. Ha egy rendszer által tárolt eljárást hajt végre egy kötegben vagy egy modulban, például egy felhasználó által definiált tárolt eljárásban vagy függvényben, javasoljuk, hogy a tárolt eljárás nevét a sys sémanévvel minősítse.

Az SQL Server rendszer kiterjesztett tárolt eljárásai a xp_karakterekkel kezdődnek, és ezek a master adatbázis dbo sémájában találhatók. Ha egy bővített rendszeralapú tárolt eljárást hajt végre egy kötegben vagy egy modulban, például egy felhasználó által definiált tárolt eljárásban vagy függvényben, javasoljuk, hogy a tárolt eljárás nevét master.dbo.

Ha felhasználó által definiált tárolt eljárást hajt végre egy kötegben vagy egy modulban, például egy felhasználó által definiált tárolt eljárásban vagy függvényben, javasoljuk, hogy a tárolt eljárás nevét sémanévvel minősítse. Nem javasoljuk, hogy a felhasználó által definiált tárolt eljárásokat a rendszer által tárolt eljárás nevével azonos néven nevezze el. További információ a tárolt eljárások végrehajtásáról: Tárolt eljárás végrehajtása.

AZ EXECUTE használata karaktersztringgel

Az SQL Serverben megadható a varchar(max) és nvarchar(max) adattípus, amely lehetővé teszi, hogy a karaktersztringek legfeljebb 2 gigabájtnyi adatot adjanak meg.

Az adatbázis-környezet változásai csak a EXECUTE utasítás végéig tartanak. Az alábbi utasításban szereplő EXECUTE futtatása után például az adatbázis-környezet master.

USE master;

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

Környezetváltás

A AS { LOGIN | USER } = '<name>' záradék használatával módosíthatja a dinamikus utasítás végrehajtási környezetét. Ha a környezeti kapcsoló EXECUTE ('string') AS <context_specification>van megadva, a környezeti kapcsoló időtartama a végrehajtott lekérdezés hatókörére korlátozódik.

Felhasználó vagy bejelentkezési név megadása

A AS { LOGIN | USER } = '<name>' megadott felhasználónévnek vagy bejelentkezési névnek egyszerűként kell lennie sys.database_principals vagy sys.server_principals, vagy az utasítás meghiúsul. Emellett IMPERSONATE engedélyeket is meg kell adni a megbízónak. Hacsak a hívó nem az adatbázis tulajdonosa, vagy a sysadmin rögzített kiszolgálói szerepkör tagja, akkor is léteznie kell, ha a felhasználó Windows-csoporttagságon keresztül fér hozzá az SQL Server adatbázisához vagy példányához. Tegyük fel például, hogy a következő feltételek teljesülnek:

  • CompanyDomain\SQLUsers csoport hozzáfér a Sales adatbázishoz.

  • CompanyDomain\SqlUser1 a SQLUsers tagja, ezért implicit hozzáféréssel rendelkezik a Sales adatbázishoz.

Bár CompanyDomain\SqlUser1 hozzáféréssel rendelkezik az adatbázishoz a SQLUsers csoport tagságán keresztül, az utasítás EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' meghiúsul, mert CompanyDomain\SqlUser1 nem létezik egyszerűként az adatbázisban.

Ajánlott eljárások

Adjon meg egy olyan bejelentkezést vagy felhasználót, amely a legkevésbé szükséges jogosultságokkal rendelkezik az utasításban vagy modulban meghatározott műveletek végrehajtásához. Például ne adjon meg olyan bejelentkezési nevet, amely kiszolgálószintű engedélyekkel rendelkezik, ha csak adatbázisszintű engedélyekre van szükség. Vagy ne adjon meg adatbázis-tulajdonosi fiókot, hacsak nincs szükség ezekre az engedélyekre.

Permissions

A EXECUTE utasítás futtatásához nincs szükség engedélyekre. Az EXECUTE sztringben hivatkozott biztonságos objektumokhoz azonban engedélyekre van szükség. Ha például a sztring INSERT utasítást tartalmaz, a EXECUTE utasítás hívójának INSERT engedéllyel kell rendelkeznie a céltáblában. A rendszer akkor is ellenőrzi az engedélyeket, amikor EXECUTE utasítás megjelenik, még akkor is, ha a EXECUTE utasítás egy modulban szerepel.

Az adatbázismotor a modulban hivatkozott objektumok engedélyeinek kiértékelése az objektumok meghívása és a hivatkozott objektumok közötti tulajdonjogi lánctól függ.

EXECUTE modulra vonatkozó engedélyeket alapértelmezés szerint a modul tulajdonosának adja át, aki átviheti őket más felhasználókhoz. Egy sztringet végrehajtó modul futtatásakor a rendszer az engedélyeket a modult végrehajtó felhasználó környezetében ellenőrzi, nem pedig a modult létrehozó felhasználó környezetében. Ha azonban ugyanaz a felhasználó birtokolja a hívó modult és a meghívandó modult, EXECUTE engedélyellenőrzés nem történik meg a második modul esetében.

Ha a modul más adatbázis-objektumokhoz fér hozzá, a végrehajtás akkor sikeres, ha EXECUTE engedéllyel rendelkezik a modulhoz, és az alábbi feltételek egyike teljesül:

  • A modul EXECUTE AS USER vagy EXECUTE AS SELFvan megjelölve, és a modul tulajdonosa rendelkezik a megfelelő engedélyekkel a hivatkozott objektumon. További információ a modulon belüli megszemélyesítésről: EXECUTE AS záradék.

  • A modul EXECUTE AS CALLERvan megjelölve, és Ön rendelkezik a megfelelő engedélyekkel az objektumon.

  • A modul EXECUTE AS <user_name>van megjelölve, és <user_name> rendelkezik a megfelelő engedélyekkel az objektumon.

Környezetváltási engedélyek

Ha EXECUTE AS szeretne megadni egy bejelentkezéshez, a hívónak IMPERSONATE engedélyekkel kell rendelkeznie a megadott bejelentkezési névhez. Az adatbázis-felhasználó EXECUTE AS megadásához a hívónak IMPERSONATE engedélyekkel kell rendelkeznie a megadott felhasználónévhez. Ha nincs megadva végrehajtási környezet, vagy EXECUTE AS CALLER van megadva, IMPERSONATE engedélyekre nincs szükség.

Példák: SQL Server

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. Egyetlen paraméter átadása az EXECUTE használatával

uspGetEmployeeManagers Az AdventureWorks2025 adatbázisban tárolt eljárás egy paramétert (@EmployeeID). Az alábbi példák a uspGetEmployeeManagers tárolt eljárást hajtják végre Employee ID 6 paraméterértékként.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

A változó explicit módon nevezhető el a végrehajtás során:

EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Ha a következők az első utasítás egy kötegben vagy egy sqlcmd szkriptben, akkor nincs szükség EXECUTE.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

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

B. Több paraméter használata

A következő példa a AdventureWorks2025 adatbázisban tárolt eljárást hajtja spGetWhereUsedProductID végre. Két paramétert ad át: az első paraméter egy termékazonosító (819), a második paraméter pedig @CheckDate egy datetime érték.

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

EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

C. AZ EXECUTE "tsql_string" használata változóval

Az alábbi példa bemutatja, hogyan kezeli EXECUTE a változókat tartalmazó dinamikusan létrehozott sztringeket. Ez a példa létrehozza a tables_cursor kurzort a AdventureWorks2025 adatbázis összes felhasználó által definiált táblájának tárolásához, majd a listával újraépíti a táblák összes indexét.

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. Az EXECUTE használata távoli tárolt eljárással

Az alábbi példa végrehajtja a uspGetEmployeeManagers tárolt eljárást a távoli kiszolgálón SQLSERVER1, és tárolja a visszatérési állapotot, amely a @retstatsikerességét vagy sikertelenségét jelzi.

DECLARE @retstat AS INT;

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

E. AZ EXECUTE használata tárolt eljárásváltozóval

Az alábbi példa létrehoz egy változót, amely egy tárolt eljárásnevet jelöl.

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

EXECUTE @proc_name;

F. AZ EXECUTE használata AZ ALAPÉRTELMEZETT beállítással

Az alábbi példa létrehoz egy tárolt eljárást az első és a harmadik paraméter alapértelmezett értékeivel. Az eljárás futtatásakor a rendszer ezeket az alapértelmezett értékeket szúrja be az első és a harmadik paraméterhez, ha a hívásban nem ad át értéket, vagy ha az alapértelmezett érték meg van adva. Figyelje meg a DEFAULT kulcsszó különböző felhasználási módjait.

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

A Proc_Test_Defaults tárolt eljárás számos kombinációban végrehajtható.

-- 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. AZ EXECUTE és az AT linked_server_name használata

Az alábbi példa egy parancssztringet ad át egy távoli kiszolgálónak. Létrehoz egy csatolt kiszolgálót SeattleSales, amely az SQL Server egy másik példányára mutat, és végrehajt egy DDL-utasítást (CREATE TABLE) a csatolt kiszolgálóval szemben.

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

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

H. AZ EXECUTE WITH RECOMPILE használata

Az alábbi példa végrehajtja a Proc_Test_Defaults tárolt eljárást, és egy új lekérdezési tervet állít össze, használ és elvet a modul végrehajtása után.

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

I. AZ EXECUTE használata felhasználó által definiált függvénnyel

A következő példa a ufnGetSalesOrderStatusText skaláris, felhasználó-definiált funkciót hajtja végre az AdventureWorks2025 adatbázisban. A függvény által visszaadott érték tárolására a @returnstatus változót használja. A függvény egy bemeneti paramétert vár, @Status. Ez adattípusként van definiálva.

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

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

PRINT @returnstatus;
GO

J. Oracle-adatbázis lekérdezése csatolt kiszolgálón az EXECUTE használatával

Az alábbi példa több SELECT utasítást hajt végre a távoli Oracle-kiszolgálón. A példa azzal kezdődik, hogy hozzáadja az Oracle-kiszolgálót csatolt kiszolgálóként, és létrehoz egy társított kiszolgálói bejelentkezést.

-- 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. Környezet váltása másik felhasználóra az EXECUTE AS USER használatával

Az alábbi példa egy Transact-SQL sztringet hajt végre, amely létrehoz egy táblát, és megadja a AS USER záradékot, amely az utasítás végrehajtási környezetét User1értékre állítja. Az adatbázismotor ellenőrzi a User1 engedélyeit az utasítás futtatásakor. User1 felhasználóként kell léteznie az adatbázisban, és engedéllyel kell rendelkeznie ahhoz, hogy táblákat hozzon létre a Sales sémában, vagy az utasítás meghiúsul.

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

L. Paraméter használata az EXECUTE és az AT linked_server_name

Az alábbi példa egy parancssztringet ad át egy távoli kiszolgálónak egy paraméter kérdőjel (?) helyőrzőjének használatával. A példa létrehoz egy csatolt kiszolgálót SeattleSales, amely az SQL Server egy másik példányára mutat, és végrehajt egy SELECT utasítást a csatolt kiszolgálón. A SELECT utasítás helyőrzőként használja a kérdőjelet a ProductID paraméterhez (952), amelyet az utasítás után ad meg.

-- 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. Egyetlen eredményhalmaz újradefinizálása az EXECUTE használatával

A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók, valamint az Azure SQL Database.

Az előző példák némelyike hét oszlopot visszaadó EXECUTE dbo.uspGetEmployeeManagers 6; hajtott végre. Az alábbi példa a WITH RESULT SET szintaxis használatát mutatja be a visszaadott eredményhalmaz nevének és adattípusának módosításához.

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. Két eredményhalmaz ismételt definiálása az EXECUTE használatával

A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók, valamint az Azure SQL Database.

Egynél több eredményhalmazt visszaadó utasítás végrehajtásakor határozza meg az egyes várt eredményhalmazokat. Az alábbi példa AdventureWorks2025 létrehoz egy eljárást, amely két eredményhalmazt ad vissza. Ezután az eljárást a WITH RESULT SETS záradékkal hajtja végre, és két eredményhalmaz-definíciót ad meg.

--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. Távoli SQL Server lekérdezése az EXECUTE és az AT DATA_SOURCE data_source_name használatával

A: SQL Server 2019 (15.x) és újabb verziókra vonatkozik.

Az alábbi példa egy parancssztringet ad át egy SQL Server-példányra mutató külső adatforrásnak.

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

P. Az EXECUTE és az AT DATA_SOURCE data_source_name használata számítási készlet lekérdezéséhez az SQL Server Big Data-fürtben

A következővonatkozik: SQL Server 2019 (15.x).

Az alábbi példa egy parancssztringet ad át egy külső adatforrásnak, amely egy számítási készletre mutat az SQL Server Big Data Clusterben. A példa létrehoz egy adatforrás-SqlComputePool egy számítási készleten az SQL Server Big Data Clusterben, és végrehajt egy SELECT utasítást az adatforráson.

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

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

Q. Az EXECUTE és az AT DATA_SOURCE data_source_name használata adatkészlet lekérdezéséhez az SQL Server Big Data-fürtben

A következővonatkozik: SQL Server 2019 (15.x).

Az alábbi példa egy parancssztringet ad át egy külső adatforrásnak, amely az SQL Server Big Data Cluster (BDC) számítási készletére mutat. A példa létrehoz egy adatforrás-SqlDataPool egy adatkészleten a BDC-ben, és végrehajt egy SELECT utasítást az adatforráson.

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

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

R. Az EXECUTE és az AT DATA_SOURCE data_source_name használata a tárolókészlet lekérdezéséhez az SQL Server Big Data-fürtben

A következővonatkozik: SQL Server 2019 (15.x).

Az alábbi példa egy parancssztringet ad át egy külső adatforrásnak, amely az SQL Server Big Data-fürt számítási készletére mutat. A példa létrehoz egy adatforrás-SqlStoragePool egy SQL Server Big Data Cluster-adatkészleten, és végrehajt egy SELECT utasítást az adatforráson.

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

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

Példák: Azure Synapse Analytics

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

Válasz: Alapszintű eljárás végrehajtása

Tárolt eljárás végrehajtása:

EXECUTE proc1;

A futtatókörnyezetben meghatározott névvel rendelkező tárolt eljárás meghívása:

EXECUTE ('EXECUTE ' + @var);

Tárolt eljárás meghívása tárolt eljárásból:

CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;

B: Sztringek végrehajtása

SQL-sztring végrehajtása:

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

Beágyazott sztring végrehajtása:

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

Sztringváltozó végrehajtása:

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

EXECUTE (@stringVar);

C: Paraméterekkel rendelkező eljárások

Az alábbi példa egy paraméterekkel rendelkező eljárást hoz létre, és az eljárás végrehajtásának három módját mutatja be:

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

Végrehajtás pozícióparaméterekkel:

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

Végrehajtás nevesített paraméterekkel a következő sorrendben:

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

Végrehajtás nevesített paraméterekkel, sorrenden kívül:

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