EXECUTE (Transact-SQL)
platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)koncový bod SQL Analytics ve službě Microsoft FabricWarehouse v Microsoft Fabricdatabáze SQL v Microsoft Fabric
Spustí řetězec příkazu nebo řetězec znaků v rámci dávky Transact-SQL nebo jeden z následujících modulů: systémová uložená procedura, uživatelem definovaná uložená procedura, uložená procedura CLR, skalární uživatelem definovaná funkce nebo rozšířená uložená procedura. Příkaz EXEC
nebo EXECUTE
lze použít k odesílání předávaných příkazů na odkazované servery. Kromě toho je možné explicitně nastavit kontext, ve kterém je spuštěn řetězec nebo příkaz. Metadata sady výsledků je možné definovat pomocí možností WITH RESULT SETS
.
Důležitý
Než zavoláte EXECUTE
s řetězcem znaků, ověřte řetězec znaku. Nikdy nespouštět příkaz vytvořený ze vstupu uživatele, který nebyl ověřen.
Syntax
Následující blok kódu ukazuje syntaxi v SQL Serveru 2019 (15.x) a novějších verzích. Alternativně se podívejte na syntaxi v SQL Serveru 2017 a starším.
Syntaxe pro SQL Server 2019 a novější verze
-- 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
}
Následující blok kódu ukazuje syntaxi v SQL Serveru 2017 (14.x) a starších verzích. Alternativně se podívejte na syntaxi v SQL Serveru 2019.
Syntaxe pro SQL Server 2017 a starší verze
-- 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
}
Syntaxe pro In-Memory OLTP
-- 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 ] ) }
}
Syntaxe pro Azure SQL Database
-- 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
}
Syntaxe pro Azure Synapse Analytics a paralelní datový sklad
-- 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 ] )
[ ; ]
Syntaxe pro Microsoft Fabric.
-- 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 ] ) }
}
Argumenty
@return_status
Volitelná celočíselná proměnná, která ukládá stav vrácení modulu. Tato proměnná musí být deklarována v dávce, uložené proceduře nebo funkci, než se použije v příkazu EXECUTE
.
Pokud se používá k vyvolání skalární uživatelem definované funkce, může být @return_status proměnná libovolného skalárního datového typu.
module_name
Plně kvalifikovaný nebo nekvalifikovaný název uložené procedury nebo uživatelem definované funkce s skalární hodnotou, která se má volat. Názvy modulů musí splňovat pravidla pro identifikátory . V názvech rozšířených uložených procedur se vždy rozlišují malá a velká písmena bez ohledu na kolaci serveru.
Modul, který byl vytvořen v jiné databázi, se dá spustit, pokud uživatel, na kterém je modul spuštěný, nebo má příslušné oprávnění k jeho spuštění v této databázi. Modul lze spustit na jiném serveru, na kterém běží SQL Server, pokud má uživatel, na kterém je modul spuštěný, příslušné oprávnění k použití daného serveru (vzdáleného přístupu) a ke spuštění modulu v této databázi. Pokud je zadán název serveru, ale není zadán žádný název databáze, databázový stroj SQL Serveru vyhledá modul ve výchozí databázi uživatele.
;číslo
Volitelné celé číslo, které se používá k seskupení procedur stejného názvu. Tento parametr se nepoužívá pro rozšířené uložené procedury.
Poznámka
Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.
Další informace o skupinách procedur naleznete v tématu CREATE PROCEDURE.
@module_name_var
Název místně definované proměnné, která představuje název modulu.
Může se jednat o proměnnou, která obsahuje název nativně zkompilované skalární uživatelem definované funkce.
@parameter
Parametr pro module_name, jak je definováno v modulu. Názvy parametrů musí předcházet znak at (@
). Při použití s @parameter_name = hodnotou formuláře nemusí být názvy parametrů a konstanty zadány v pořadí, v jakém jsou definovány v modulu. Pokud je však @parameter_name = hodnota formulář použit pro libovolný parametr, musí se použít pro všechny následné parametry.
Ve výchozím nastavení jsou parametry s možnou hodnotou null.
hodnoty
Hodnota parametru, který se má předat modulu nebo předávacímu příkazu. Pokud nejsou zadány názvy parametrů, je nutné zadat hodnoty parametrů v pořadí definovaném v modulu.
Při spouštění předávaných příkazů na odkazovaných serverech závisí pořadí hodnot parametrů na zprostředkovateli OLE DB propojeného serveru. Většina zprostředkovatelů OLE DB sváže hodnoty s parametry zleva doprava.
Pokud je hodnota parametru název objektu, znakový řetězec nebo kvalifikovaný názvem databáze nebo názvu schématu, musí být celý název uzavřen v jednoduchých uvozovkách. Pokud je hodnota parametru klíčovým slovem, musí být klíčové slovo uzavřeno do dvojitých uvozovek.
Pokud předáte jedno slovo, které nezačíná @
, které není uzavřeno v uvozovkách (například pokud zapomenete @
u názvu parametru), bude slovo považováno za nvarchar řetězec, i když chybí uvozovky.
Pokud je v modulu definována výchozí hodnota, uživatel může modul spustit bez zadání parametru.
Výchozí nastavení může být také NULL
. Obecně platí, že definice modulu určuje akci, která se má provést, pokud je hodnota parametru NULL
.
@variable
Proměnná, která ukládá parametr nebo návratový parametr.
VÝSTUP
Určuje, že modul nebo příkazový řetězec vrací parametr. Odpovídající parametr v modulu nebo příkazovém řetězci musí být také vytvořen pomocí klíčového slova OUTPUT
. Toto klíčové slovo použijte, když jako parametry použijete proměnné kurzoru.
Pokud hodnota je definována jako OUTPUT
modulu spuštěného na propojeném serveru, všechny změny odpovídajících @parameter prováděné zprostředkovatelem OLE DB se zkopírují zpět do proměnné na konci spuštění modulu.
Pokud se používají OUTPUT
parametry a záměrem je použít návratové hodnoty v jiných příkazech v rámci volající dávky nebo modulu, musí být hodnota parametru předána jako proměnná, například @parameter = @variable. Modul nelze spustit zadáním OUTPUT
pro parametr, který není definován jako parametr OUTPUT
v modulu. Konstanty nelze předat modulu pomocí OUTPUT
; návratový parametr vyžaduje název proměnné. Před provedením procedury musí být deklarován datový typ proměnné a přiřazena hodnota.
Pokud EXECUTE
použijete pro vzdálenou uloženou proceduru nebo spustíte průchozí příkaz na propojeném serveru, OUTPUT
parametry nemůžou být žádný z velkých datových typů objektu (LOB).
Návratové parametry můžou být libovolného datového typu s výjimkou datových typů LOB.
VÝCHOZÍ
Poskytuje výchozí hodnotu parametru, jak je definováno v modulu. Pokud modul očekává hodnotu parametru, který nemá definované výchozí nastavení a chybí parametr nebo je zadán klíčové slovo DEFAULT
, dojde k chybě.
@string_variable
Název místní proměnné. @string_variable může být libovolný znak, varchar, ncharnebo nvarchar datový typ. Patří sem datové typy (max.).
[N]'tsql_string'
Konstantní řetězec. N
zahrnut, řetězec se interpretuje jako nvarchar datového typu.
CONTEXT_SPECIFICATION AS
Určuje kontext, ve kterém se příkaz spustí.
PŘIHLÁŠENÍ DO SYSTÉMU
Určuje kontext, který se má zosobnět, je přihlášení. Obor zosobnění je server.
UŽIVATEL
Určuje kontext, který má být zosobněný, je uživatel v aktuální databázi. Rozsah zosobnění je omezen na aktuální databázi. Kontextový přepínač na uživatele databáze nedědí oprávnění na úrovni serveru daného uživatele.
Důležitý
Když je kontextový přepínač na uživatele databáze aktivní, všechny pokusy o přístup k prostředkům mimo databázi způsobí selhání příkazu. To zahrnuje USE <database>
příkazy, distribuované dotazy a dotazy, které odkazují na jinou databázi pomocí třídílných nebo čtyřdílných identifikátorů.
název
Platný uživatel nebo přihlašovací jméno. Argument
Tento argument nemůže být předdefinovaný účet, například NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
nebo NT AUTHORITY\LocalSystem
.
Další informace najdete v tématu Zadání uživatele nebo přihlašovacího jména dále v tomto článku.
[N] 'command_string'
Konstantní řetězec obsahující příkaz, který se má předat propojenému serveru. Pokud je N
zahrnut, řetězec se interpretuje jako nvarchar datového typu.
[?]
Určuje parametry, pro které jsou hodnoty zadané v <arg-list>
předávacích příkazů, které se používají v příkazu EXECUTE ('...', <arg-list>) AT <linkedsrv>
.
AT linked_server_name
Určuje, že command_string se spustí proti linked_server_name a výsledky, pokud existují, se vrátí klientovi. linked_server_name musí odkazovat na existující definici propojeného serveru na místním serveru. Propojené servery jsou definovány pomocí sp_addlinkedserver.
WITH <execute_option>
Možné možnosti spuštění. Možnosti
RESULT SETS
nelze zadat v příkazuINSERT...EXECUTE
.
AT DATA_SOURCE data_source_name
platí pro: SQL Server 2019 (15.x) a novější verze.
Určuje, že command_string se spustí s data_source_name a výsledky, pokud existují, se vrátí klientovi.
data_source_name musí odkazovat na existující definici EXTERNAL DATA SOURCE
v databázi. Podporují se pouze zdroje dat, které odkazují na SQL Server. Kromě toho se podporují zdroje dat clusteru s velkými objemy dat SQL Serveru, které odkazují na výpočetní fond, fond dat nebo fond úložiště. Zdroje dat jsou definovány pomocí CREATE EXTERNAL DATA SOURCE.
WITH <execute_option>
Možné možnosti spuštění. Možnosti
RESULT SETS
nelze zadat v příkazuINSERT...EXECUTE
.Semestr Definice RECOMPILE
Vynutí, aby se po spuštění modulu zkompiloval, použil a zahodil nový plán. Pokud pro modul existuje plán dotazu, zůstane tento plán v mezipaměti.
Tuto možnost použijte, pokud je zadaný parametr atypický nebo pokud se data výrazně změnila. Tato možnost se nepoužívá pro rozšířené uložené procedury. Tuto možnost doporučujeme používat střídmě, protože je nákladná.
Poznámka: Nemůžete použítWITH RECOMPILE
při volání uložené procedury, která používá syntaxiOPENDATASOURCE
. MožnostWITH RECOMPILE
je ignorována při zadání názvu objektu se čtyřmi částmi.
Poznámka:RECOMPILE
není podporována u nativně kompilovaných skalárních uživatelem definovaných funkcí. Pokud potřebujete překompilovat, použijte sp_recompile.RESULT SETS UNDEFINED
Tato možnost neposkytuje žádnou záruku toho, jaké výsledky jsou vráceny, a není k dispozici žádná definice. Příkaz se spustí bez chyby, pokud se vrátí nějaké výsledky nebo se nevrátí žádné výsledky. RESULT SETS UNDEFINED
je výchozím chováním, pokud není zadaný result_sets_option.
Pro interpretované skalární uživatelem definované funkce a nativně kompilované skalární uživatelem definované funkce není tato možnost funkční, protože funkce nikdy nevrací sadu výsledků.
platí pro: SQL Server 2012 (11.x) a novější verze a Azure SQL Database.RESULT SETS NONE
Zaručuje, že příkaz EXECUTE
nevrací žádné výsledky. Pokud se vrátí nějaké výsledky, dávka se přeruší.
Pro interpretované skalární uživatelem definované funkce a nativně kompilované skalární uživatelem definované funkce není tato možnost funkční, protože funkce nikdy nevrací sadu výsledků.
platí pro: SQL Server 2012 (11.x) a novější verze a Azure SQL Database.<result_sets_definition>
Poskytuje záruku, že se výsledek vrátí, jak je uvedeno v result_sets_definition
. Pro příkazy, které vracejí více sad výsledků, zadejte více result_sets_definition oddílů. Každou result_sets_definition uzavřete do závorek oddělených čárkami. Další informace najdete v<result_sets_definition>
dále v tomto článku.
Tato možnost vždy způsobí chybu pro nativně kompilované skalární uživatelem definované funkce, protože funkce nikdy nevrací sadu výsledků.
platí pro: SQL Server 2012 (11.x) a novější verze a Azure SQL Database.<result_sets_definition>
popisuje sady výsledků vrácené provedenými příkazy. Klauzuleresult_sets_definition
mají následující význam:Semestr Definice { column_name data_type
[ COLLATE collation_name ]
[NULL | NOT NULL] }Podívejte se na následující tabulku. db_name Název databáze obsahující funkci s hodnotou tabulky, zobrazení nebo tabulky. schema_name Název schématu, který vlastní tabulku, zobrazení nebo funkci s hodnotou tabulky. table_name | view_name | table_valued_function_name Určuje, že vrácené sloupce jsou sloupce zadané v tabulce, zobrazení nebo funkci s hodnotou tabulky s názvem. Proměnné tabulky, dočasné tabulky a synonyma se v syntaxi objektu AS nepodporují. AS TYPE [ schema_name. ]table_type_name Určuje, že vrácené sloupce jsou zadané v typu tabulky. AS FOR XML Určuje, že výsledky XML z příkazu nebo uložené procedury volané příkazem EXECUTE
jsou převedeny do formátu, jako by byly vytvořeny příkazemSELECT ... FOR XML ...
. Veškeré formátování direktiv typů v původním příkazu je odebráno a vrácené výsledky jsou stejné, jako by nebyla zadána direktiva typu. FUNKCE AS FOR XML nepřevádí tabulkové výsledky mimo XML z provedeného příkazu nebo uložené procedury do XML.Semestr Definice column_name Názvy jednotlivých sloupců. Pokud se počet sloupců liší od sady výsledků, dojde k chybě a dávka se přeruší. Pokud se název sloupce liší od sady výsledků, bude vrácený název sloupce nastaven na definovaný název. data_type Datové typy jednotlivých sloupců. Pokud se datové typy liší, provede se implicitní převod na definovaný datový typ. Pokud převod selže, dávka se přeruší. COLLATION_NAME COLLATE Kolace každého sloupce. Pokud dojde k neshodě kolace, pokusí se implicitní kolace. Pokud se to nezdaří, dávka se přeruší. NULL | NOT NULL Hodnota nullability každého sloupce. Pokud je definovaná nullability NOT NULL
a vrácená data obsahují hodnoty null, dojde k chybě a dávka se přeruší. Pokud není zadána, výchozí hodnota odpovídá nastaveníANSI_NULL_DFLT_ON
aANSI_NULL_DFLT_OFF
možností.Skutečná sada výsledků vrácená během provádění se může lišit od výsledku definovaného pomocí klauzule
WITH RESULT SETS
jedním z následujících způsobů: počet sad výsledků, počet sloupců, název sloupce, hodnota nullability a datový typ. Pokud se počet sad výsledků liší, dojde k chybě a dávka se přeruší.
Poznámky
Parametry lze zadat buď pomocí hodnoty, nebo pomocí @parameter_name = hodnoty. Parametr není součástí transakce; proto pokud se parametr změní v transakci, která se později vrátí zpět, hodnota parametru se neodvrátí k předchozí hodnotě. Hodnota vrácená volajícímu je vždy hodnotou v době, kdy modul vrátí.
K vnoření dochází, když jeden modul volá jiný nebo spouští spravovaný kód odkazováním na modul CLR (Common Language Runtime), uživatelem definovaný typ nebo agregaci. Úroveň vnoření se zvýší, když se spustí spuštění volaný modul nebo odkaz na spravovaný kód, a dekrementuje, když se zavoláný modul nebo odkaz spravovaného kódu dokončí. Překročení maximálního počtu 32 úrovní vnoření způsobí selhání kompletního volajícího řetězce. Aktuální úroveň vnoření je uložena v systémové funkci @@NESTLEVEL
.
Vzhledem k tomu, že vzdálené uložené procedury a rozšířené uložené procedury nejsou v rámci transakce (pokud nejsou vydány v rámci příkazu BEGIN DISTRIBUTED TRANSACTION
nebo při použití s různými možnostmi konfigurace), nelze příkazy spouštěné prostřednictvím volání vrátit zpět. Další informace naleznete v tématu Systémové uložené procedury a BEGIN DISTRIBUTED TRANSACTION.
Pokud použijete proměnné kurzoru, spustíte proceduru, která předá proměnnou kurzoru s přiděleným kurzorem, dojde k chybě.
Při provádění modulů nemusíte při provádění modulů zadávat klíčové slovo EXECUTE
, pokud je příkaz první v dávce.
Další informace specifické pro uložené procedury CLR naleznete v tématu CLR Uložené procedury.
Použití příkazu EXECUTE s uloženými procedurami
Při provádění uložených procedur nemusíte při provádění uložených procedur zadávat klíčové slovo EXECUTE
, když je příkaz první v dávce.
Systémové uložené procedury SYSTÉMU SQL Server začínají znaky sp_
. Jsou fyzicky uloženy v Databáze prostředků, ale logicky se zobrazují ve schématu sys každého systému a uživatelem definované databáze. Když spustíte systémovou uloženou proceduru, buď v dávce, nebo v modulu, jako je například uživatelem definovaná uložená procedura nebo funkce, doporučujeme kvalifikovat název uložené procedury názvem schématu sys.
Systém SQL Server rozšířené uložené procedury začínají znaky xp_
a jsou obsaženy ve schématu dbo databáze master
. Když spustíte systémovou rozšířenou uloženou proceduru, buď v dávce, nebo uvnitř modulu, jako je uživatelem definovaná uložená procedura nebo funkce, doporučujeme kvalifikovat název uložené procedury pomocí master.dbo
.
Při spuštění uživatelem definované uložené procedury, a to buď v dávce nebo uvnitř modulu, jako je uživatelem definovaná uložená procedura nebo funkce, doporučujeme kvalifikovat název uložené procedury názvem schématu. Nedoporučujeme pojmenovat uživatelem definovanou uloženou proceduru se stejným názvem jako systémová uložená procedura. Další informace o provádění uložených procedur naleznete v tématu Spuštění uložené procedury.
Použití příkazu EXECUTE se znakovým řetězcem
V SQL Serveru je možné zadat
Změny v kontextu databáze jsou poslední až do konce příkazu EXECUTE
. Například po spuštění EXECUTE
v tomto následujícím příkazu je kontext databáze master
.
USE master;
EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Přepínání kontextu
Pomocí klauzule AS { LOGIN | USER } = '<name>'
můžete přepnout kontext provádění dynamického příkazu. Pokud je kontextový přepínač zadán jako EXECUTE ('string') AS <context_specification>
, doba trvání kontextového přepínače je omezena na rozsah spuštěného dotazu.
Zadání uživatele nebo přihlašovacího jména
Uživatel nebo přihlašovací jméno zadané v AS { LOGIN | USER } = '<name>'
musí existovat jako objekt zabezpečení v sys.database_principals
nebo sys.server_principals
nebo příkaz selže. Kromě toho musí být pro objekt zabezpečení udělena oprávnění IMPERSONATE
. Pokud není volající vlastníkem databáze nebo není členem role správce systému pevný server, musí objekt zabezpečení existovat, i když uživatel přistupuje k databázi nebo instanci SQL Serveru prostřednictvím členství ve skupině Systému Windows. Předpokládejme například následující podmínky:
CompanyDomain\SQLUsers
skupina má přístup k databáziSales
.CompanyDomain\SqlUser1
je členemSQLUsers
, a proto má implicitní přístup k databáziSales
.
Přestože CompanyDomain\SqlUser1
má přístup k databázi prostřednictvím členství ve skupině SQLUsers
, příkaz EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
selže, protože CompanyDomain\SqlUser1
v databázi neexistuje jako objekt zabezpečení.
Osvědčené postupy
Zadejte přihlašovací jméno nebo uživatele s nejnižšími oprávněními potřebnými k provádění operací definovaných v příkazu nebo modulu. Například nezadávejte přihlašovací jméno, které má oprávnění na úrovni serveru, pokud jsou vyžadována pouze oprávnění na úrovni databáze. Nebo nezadávejte účet vlastníka databáze, pokud tato oprávnění nejsou nutná.
Dovolení
Ke spuštění příkazu EXECUTE
se nevyžadují oprávnění. Oprávnění jsou však vyžadována pro zabezpečitelné, které jsou odkazovány v rámci řetězce EXECUTE
. Pokud například řetězec obsahuje příkaz INSERT
, volající příkazu EXECUTE
musí mít INSERT
oprávnění k cílové tabulce. Oprávnění se kontrolují v době, kdy je příkaz EXECUTE
zjištěn, i když je příkaz EXECUTE
součástí modulu.
EXECUTE
oprávnění pro modul výchozí pro vlastníka modulu, který je může převést na jiné uživatele. Při spuštění modulu, který spouští řetězec, se oprávnění kontrolují v kontextu uživatele, který modul spouští, ne v kontextu uživatele, který modul vytvořil. Pokud ale stejný uživatel vlastní volající modul a modul, který se volá, EXECUTE
kontrola oprávnění se pro druhý modul neprovádí.
Pokud modul přistupuje k jiným databázovým objektům, provádění proběhne úspěšně, pokud máte oprávnění k modulu EXECUTE
a platí jedna z následujících podmínek:
Modul je označen
EXECUTE AS USER
neboEXECUTE AS SELF
a vlastník modulu má odpovídající oprávnění pro odkazovaný objekt. Další informace o zosobnění v rámci modulu najdete v tématu klauzule EXECUTE AS.Modul je označen
EXECUTE AS CALLER
a máte odpovídající oprávnění k objektu.Modul je označen
EXECUTE AS <user_name>
a<user_name>
má odpovídající oprávnění k objektu.
Oprávnění pro přepínání kontextu
Pokud chcete zadat EXECUTE AS
pro přihlášení, volající musí mít IMPERSONATE
oprávnění k zadanému přihlašovacímu jménu. Chcete-li zadat EXECUTE AS
pro uživatele databáze, volající musí mít IMPERSONATE
oprávnění k zadanému uživatelskému jménu. Pokud není zadaný žádný kontext spuštění nebo je zadán EXECUTE AS CALLER
, IMPERSONATE
oprávnění nejsou vyžadována.
Příklady: SQL Server
Ukázky kódu Transact-SQL v tomto článku používají AdventureWorks2022
nebo AdventureWorksDW2022
ukázkovou databázi, kterou si můžete stáhnout z domovské stránky ukázky Microsoft SQL Serveru a projekty komunity.
A. Předání jednoho parametru pomocí příkazu EXECUTE
uspGetEmployeeManagers
uložená procedura v databázi AdventureWorks2022 očekává jeden parametr (@EmployeeID
). Následující příklady spustí uspGetEmployeeManagers
uloženou proceduru s Employee ID 6
jako hodnotou parametru.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
Proměnnou lze explicitně pojmenovat při provádění:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Pokud se jedná o první příkaz v dávce nebo skriptu sqlcmd, EXECUTE
se nevyžaduje.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Použití více parametrů
Následující příklad spustí spGetWhereUsedProductID
uloženou proceduru v databázi AdventureWorks2022. Předává dva parametry: první parametr je ID produktu (819
) a druhý parametr @CheckDate
je hodnota datetime.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Použití příkazu EXECUTE tsql_string s proměnnou
Následující příklad ukazuje, jak EXECUTE
zpracovává dynamicky sestavené řetězce, které obsahují proměnné. Tento příklad vytvoří kurzor tables_cursor
pro uložení seznamu všech uživatelem definovaných tabulek v databázi AdventureWorks2022
a potom tento seznam použije k opětovnému sestavení všech indexů v tabulkách.
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. Použití příkazu EXECUTE se vzdálenou uloženou procedurou
Následující příklad spustí uspGetEmployeeManagers
uloženou proceduru na vzdáleném serveru SQLSERVER1
a uloží návratový stav, který indikuje úspěch nebo selhání v @retstat
.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. Použití příkazu EXECUTE s proměnnou uložené procedury
Následující příklad vytvoří proměnnou, která představuje název uložené procedury.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. Použití příkazu EXECUTE s výchozím nastavením
Následující příklad vytvoří uloženou proceduru s výchozími hodnotami pro první a třetí parametry. Při spuštění procedury jsou tyto výchozí hodnoty vloženy pro první a třetí parametry, pokud není předána žádná hodnota ve volání nebo při zadání výchozí hodnoty. Všimněte si různých způsobů použití klíčového slova DEFAULT
.
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
Uloženou proceduru Proc_Test_Defaults
lze spustit v mnoha kombinacích.
-- 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. Použití příkazu EXECUTE s at linked_server_name
Následující příklad předá řetězec příkazu vzdálenému serveru. Vytvoří propojený server SeattleSales
, který odkazuje na jinou instanci SQL Serveru a spustí příkaz DDL (CREATE TABLE
) na tomto propojeném serveru.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. Použití příkazu EXECUTE WITH RECOMPILE
Následující příklad spustí Proc_Test_Defaults
uloženou proceduru a vynutí, aby se nový plán dotazu zkompiloval, použil a zahodil po spuštění modulu.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
Já. Použití příkazu EXECUTE s uživatelem definovanou funkcí
Následující příklad spustí ufnGetSalesOrderStatusText
skalární uživatelem definovanou funkci v databázi AdventureWorks2022. Používá proměnnou @returnstatus
k uložení hodnoty vrácené funkcí. Funkce očekává jeden vstupní parametr, @Status
. To je definováno jako tinyint datový typ.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. Použití příkazu EXECUTE k dotazování databáze Oracle na propojeném serveru
Následující příklad spustí několik příkazů SELECT
na vzdáleném serveru Oracle. Příklad začíná přidáním serveru Oracle jako propojeného serveru a vytvořením přihlášení k propojenému serveru.
-- 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. Použití příkazu EXECUTE AS USER k přepnutí kontextu na jiného uživatele
Následující příklad spustí řetězec Transact-SQL, který vytvoří tabulku a určuje klauzuli AS USER
pro přepnutí kontextu provádění příkazu z volajícího na User1
. Databázový stroj kontroluje oprávnění User1
při spuštění příkazu.
User1
musí existovat jako uživatel v databázi a musí mít oprávnění k vytváření tabulek ve schématu Sales
nebo příkaz selže.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
L. Použití parametru s execute a AT linked_server_name
Následující příklad předá vzdálenému serveru řetězec příkazu pomocí zástupného symbolu otazníku (?
) pro parametr. Tento příklad vytvoří propojený server SeattleSales
, který odkazuje na jinou instanci SQL Serveru a spustí příkaz SELECT
na tento propojený server. Příkaz SELECT
používá otazník jako držitel místa pro parametr ProductID
(952
), který je uveden za příkazem.
-- 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. Použití příkazu EXECUTE k opětovnému definici jedné sady výsledků
platí pro: SQL Server 2012 (11.x) a novější verze a Azure SQL Database.
Některé z předchozích příkladů se spustily EXECUTE dbo.uspGetEmployeeManagers 6;
, které vrátily sedm sloupců. Následující příklad ukazuje použití WITH RESULT SET
syntaxe ke změně názvů a datových typů vrácené sady výsledků.
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. Pomocí příkazu EXECUTE předefinovat dvě sady výsledků
platí pro: SQL Server 2012 (11.x) a novější verze a Azure SQL Database.
Při provádění příkazu, který vrací více než jednu sadu výsledků, definujte každou očekávanou sadu výsledků. Následující příklad v AdventureWorks2022
vytvoří proceduru, která vrátí dvě sady výsledků. Pak se procedura provede pomocí klauzule WITH RESULT SETS
a určí dvě definice sady výsledků.
--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. Použití příkazu EXECUTE s AT DATA_SOURCE data_source_name k dotazování vzdáleného SQL Serveru
platí pro: SQL Server 2019 (15.x) a novější verze.
Následující příklad předá řetězec příkazu externímu zdroji dat odkazující na instanci SQL Serveru.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Použití příkazu EXECUTE s AT DATA_SOURCE data_source_name k dotazování výpočetního fondu v clusteru SQL Server Big Data
platí pro: SQL Server 2019 (15.x).
Následující příklad předá do externího zdroje dat řetězec příkazu odkazující na výpočetní fond v clusteru SQL Server Pro velké objemy dat. Tento příklad vytvoří zdroj dat SqlComputePool
pro výpočetní fond v clusteru SQL Server Big Data a spustí příkaz SELECT
vůči zdroji dat.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Použití příkazu EXECUTE s at DATA_SOURCE data_source_name k dotazování fondu dat v clusteru s velkými objemy dat SQL Serveru
platí pro: SQL Server 2019 (15.x).
Následující příklad předá řetězec příkazu externímu zdroji dat odkazující na výpočetní fond v clusteru SQL Server Big Data Cluster (BDC). Tento příklad vytvoří zdroj dat SqlDataPool
pro fond dat ve službě BDC a spustí příkaz SELECT
proti zdroji dat.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
R. Použití příkazu EXECUTE s AT DATA_SOURCE data_source_name k dotazování fondu úložiště v clusteru s velkými objemy dat SQL Serveru
platí pro: SQL Server 2019 (15.x).
Následující příklad předá řetězec příkazu externímu zdroji dat odkazující na výpočetní fond v clusteru s velkými objemy dat SQL Serveru. Tento příklad vytvoří zdroj dat SqlStoragePool
pro fond dat v clusteru SQL Serveru pro velké objemy dat a spustí SELECT
příkaz proti zdroji dat.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Příklady: Azure Synapse Analytics
Ukázky kódu Transact-SQL v tomto článku používají AdventureWorks2022
nebo AdventureWorksDW2022
ukázkovou databázi, kterou si můžete stáhnout z domovské stránky ukázky Microsoft SQL Serveru a projekty komunity.
A: Provádění základní procedury
Spusťte uloženou proceduru:
EXECUTE proc1;
Volání uložené procedury s názvem určeným za běhu:
EXECUTE ('EXECUTE ' + @var);
Volání uložené procedury z uložené procedury:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Provádění řetězců
Spusťte řetězec SQL:
EXECUTE ('SELECT * FROM sys.types');
Spusťte vnořený řetězec:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Spusťte řetězcovou proměnnou:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Procedury s parametry
Následující příklad vytvoří proceduru s parametry a ukazuje tři způsoby spuštění procedury:
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
Spusťte s použitím pozičních parametrů:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Spusťte s použitím pojmenovaných parametrů v pořadí:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Spusťte příkaz s použitím pojmenovaných parametrů mimo pořadí:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Související obsah
-
@@NESTLEVEL (Transact-SQL) - DECLARE @local_variable (Transact-SQL)
-
EXECUTE AS (Transact-SQL) - nástroje
osql - objekty zabezpečení
(databázový stroj) -
REVERT (Transact-SQL) - sp_addlinkedserver (Transact-SQL)
- nástroj sqlcmd
-
SUSER_NAME (Transact-SQL) -
sys.database_principals (Transact-SQL) -
sys.server_principals (Transact-SQL) -
USER_NAME (Transact-SQL) -
OPENDATASOURCE (Transact-SQL) - Skalární User-Defined Functions pro In-Memory OLTP