KÖR (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric
Kör en kommandosträng eller teckensträng i en Transact-SQL batch, eller någon av följande moduler: system lagrad procedur, användardefinierad lagrad procedur, CLR-lagrad procedur, skalvärdesbaserad användardefinierad funktion eller utökad lagrad procedur. Instruktionen EXEC
eller EXECUTE
kan användas för att skicka direktkommandon till länkade servrar. Dessutom kan kontexten där en sträng eller ett kommando körs uttryckligen anges. Metadata för resultatuppsättningen kan definieras med hjälp av WITH RESULT SETS
alternativ.
Viktig
Innan du anropar EXECUTE
med en teckensträng verifierar du teckensträngen. Kör aldrig ett kommando som skapats från användarindata som inte har verifierats.
Transact-SQL syntaxkonventioner
Syntax
Följande kodblock visar syntaxen i SQL Server 2019 (15.x) och senare versioner. Du kan också läsa syntax i SQL Server 2017 och tidigare i stället.
Syntax för SQL Server 2019 och senare versioner.
-- 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
}
Följande kodblock visar syntaxen i SQL Server 2017 (14.x) och tidigare versioner. Du kan också läsa syntax i SQL Server 2019 i stället.
Syntax för SQL Server 2017 och tidigare versioner.
-- 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
}
Syntax för 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 ] ) }
}
Syntax för 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
}
Syntax för Azure Synapse Analytics och Parallel Data Warehouse.
-- 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 ] )
[ ; ]
Syntax för 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 ] ) }
}
Argument
@return_status
En valfri heltalsvariabel som lagrar returstatusen för en modul. Den här variabeln måste deklareras i batchen, den lagrade proceduren eller funktionen innan den används i en EXECUTE
-instruktion.
När den används för att anropa en skalär-värderad användardefinierad funktion kan @return_status variabeln vara av valfri skalär datatyp.
module_name
Det fullständigt kvalificerade eller icke-kvalificerade namnet på den lagrade proceduren eller den skalärvärdesbegränsade användardefinierade funktion som ska anropas. Modulnamn måste följa reglerna för identifierare. Namnen på utökade lagrade procedurer är alltid skiftlägeskänsliga, oavsett serverns sortering.
En modul som har skapats i en annan databas kan köras om användaren som kör modulen äger modulen eller har rätt behörighet att köra den i databasen. En modul kan köras på en annan server som kör SQL Server om användaren som kör modulen har rätt behörighet att använda servern (fjärråtkomst) och köra modulen i databasen. Om ett servernamn anges men inget databasnamn har angetts söker SQL Server Database Engine efter modulen i användarens standarddatabas.
;nummer
Ett valfritt heltal som används för att gruppera procedurer med samma namn. Den här parametern används inte för utökade lagrade procedurer.
Not
Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.
Mer information om procedurgrupper finns i CREATE PROCEDURE.
@module_name_var
Namnet på en lokalt definierad variabel som representerar ett modulnamn.
Detta kan vara en variabel som innehåller namnet på en internt kompilerad, skalär användardefinierad funktion.
@parameter
Parametern för module_name, enligt definitionen i modulen. Parameternamn måste föregås av vid-tecknet (@
). När det används med @parameter_name = -värdet formulär behöver parameternamn och konstanter inte anges i den ordning de definieras i modulen. Men om det @parameter_name = värdet formulär används för någon parameter, måste det användas för alla efterföljande parametrar.
Som standard kan parametrarna vara null.
värde
Värdet för parametern som ska skickas till modulen eller direktkommandot. Om parameternamn inte anges måste parametervärden anges i den ordning som definieras i modulen.
När du kör direktkommandon mot länkade servrar beror ordningen på parametervärdena på OLE DB-providern för den länkade servern. De flesta OLE DB-providers binder värden till parametrar från vänster till höger.
Om värdet för en parameter är ett objektnamn, en teckensträng eller ett databasnamn eller ett schemanamn måste hela namnet omges av enkla citattecken. Om värdet för en parameter är ett nyckelord måste nyckelordet omges av dubbla citattecken.
Om du skickar ett ord som inte börjar med @
, som inte omges av citattecken (om du till exempel glömmer @
på ett parameternamn), behandlas ordet som en nvarchar sträng, trots att citattecknen saknas.
Om ett standardvärde definieras i modulen kan en användare köra modulen utan att ange en parameter.
Standardvärdet kan också vara NULL
. I allmänhet anger moduldefinitionen den åtgärd som ska vidtas om ett parametervärde NULL
.
@variable
Variabeln som lagrar en parameter eller en returparameter.
UTDATA
Anger att modulen eller kommandosträngen returnerar en parameter. Den matchande parametern i modulen eller kommandosträngen måste också ha skapats med hjälp av nyckelordet OUTPUT
. Använd det här nyckelordet när du använder markörvariabler som parametrar.
Om värde definieras som OUTPUT
för en modul som körs mot en länkad server kopieras alla ändringar av motsvarande @parameter som utförs av OLE DB-providern tillbaka till variabeln i slutet av körningen av modulen.
Om OUTPUT
parametrar används och avsikten är att använda returvärdena i andra instruktioner i den anropande batchen eller modulen, måste värdet för parametern skickas som en variabel, till exempel @parameter = @variable. Du kan inte köra en modul genom att ange OUTPUT
för en parameter som inte definieras som en OUTPUT
parameter i modulen. Konstanter kan inte skickas till modulen med hjälp av OUTPUT
; returparametern kräver ett variabelnamn. Datatypen för variabeln måste deklareras och ett värde tilldelas innan proceduren körs.
När EXECUTE
används mot en fjärrlagringsprocedur eller för att köra ett direktkommando mot en länkad server kan OUTPUT
parametrar inte vara någon av de stora objektdatatyperna (LOB).
Returparametrar kan vara av vilken datatyp som helst utom LOB-datatyperna.
STANDARD
Tillhandahåller standardvärdet för parametern enligt definitionen i modulen. När modulen förväntar sig ett värde för en parameter som inte har en definierad standard och antingen en parameter saknas eller DEFAULT
nyckelord anges uppstår ett fel.
@string_variable
Namnet på en lokal variabel. @string_variable kan vara valfritt tecken, varchar, nchareller nvarchar datatyp. Dessa omfattar (max) datatyper.
[N]'tsql_string'
En konstant sträng.
tsql_string kan vara valfri nvarchar eller varchar datatyp. Om N
ingår tolkas strängen som nvarchar datatyp.
AS-context_specification
Anger i vilken kontext instruktionen körs.
LOGGA IN
Anger att kontexten som ska personifieras är en inloggning. Omfånget för personifiering är servern.
ANVÄNDARE
Anger att kontexten som ska personifieras är en användare i den aktuella databasen. Omfattningen för personifiering är begränsad till den aktuella databasen. En kontextväxling till en databasanvändare ärver inte användarens behörigheter på servernivå.
Viktig
Kontextväxlingen till databasanvändaren är aktiv, men alla försök att komma åt resurser utanför databasen gör att instruktionen misslyckas. Detta omfattar USE <database>
-instruktioner, distribuerade frågor och frågor som refererar till en annan databas med hjälp av identifierare i tre delar eller fyra delar.
"namn"
Ett giltigt användar- eller inloggningsnamn. Argumentet namn måste vara medlem i sysadmin fast serverroll eller finnas som huvudnamn i sys.database_principals respektive sys.server_principals.
Det här argumentet kan inte vara ett inbyggt konto, till exempel NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
eller NT AUTHORITY\LocalSystem
.
Mer information finns i Ange ett användar- eller inloggningsnamn senare i den här artikeln.
[N]'command_string'
En konstant sträng som innehåller kommandot som ska skickas till den länkade servern. Om N
ingår tolkas strängen som nvarchar datatyp.
[?]
Anger parametrar för vilka värden anges i <arg-list>
av direktkommandon som används i en EXECUTE ('...', <arg-list>) AT <linkedsrv>
-instruktion.
AT linked_server_name
Anger att command_string körs mot linked_server_name och att eventuella resultat returneras till klienten. linked_server_name måste referera till en befintlig länkad serverdefinition på den lokala servern. Länkade servrar definieras med hjälp av sp_addlinkedserver.
WITH <execute_option>
Möjliga körningsalternativ. Det går inte att ange
RESULT SETS
alternativ i enINSERT...EXECUTE
-instruktion.
AT DATA_SOURCE data_source_name
gäller för: SQL Server 2019 (15.x) och senare versioner.
Anger att command_string körs mot data_source_name och att eventuella resultat returneras till klienten.
data_source_name måste referera till en befintlig EXTERNAL DATA SOURCE
definition i databasen. Endast datakällor som pekar på SQL Server stöds. För SQL Server-stordatakluster stöds dessutom datakällor som pekar på beräkningspool, datapool eller lagringspool. Datakällor definieras med hjälp av CREATE EXTERNAL DATA SOURCE.
WITH <execute_option>
Möjliga körningsalternativ. Det går inte att ange
RESULT SETS
alternativ i enINSERT...EXECUTE
-instruktion.Term Definition RECOMPILE
Tvingar fram en ny plan som ska kompileras, användas och ignoreras när modulen har körts. Om det finns en befintlig frågeplan för modulen finns den här planen kvar i cacheminnet.
Använd det här alternativet om parametern som du anger är atypisk eller om data har ändrats avsevärt. Det här alternativet används inte för utökade lagrade procedurer. Vi rekommenderar att du använder det här alternativet sparsamt eftersom det är dyrt.
Obs! Du kan inte användaWITH RECOMPILE
när du anropar en lagrad procedur som använderOPENDATASOURCE
syntax. AlternativetWITH RECOMPILE
ignoreras när ett objektnamn i fyra delar anges.
Obs!RECOMPILE
stöds inte med inbyggda, skalära användardefinierade funktioner. Om du behöver kompilera om använder du sp_recompile.RESULT SETS UNDEFINED
Det här alternativet ger ingen garanti för vilka resultat, om några, som returneras och ingen definition anges. Instruktionen körs utan fel om några resultat returneras eller inga resultat returneras. RESULT SETS UNDEFINED
är standardbeteendet om en result_sets_option inte tillhandahålls.
För tolkade skalära användardefinierade funktioner och inbyggda kompilerade skalära användardefinierade funktioner är det här alternativet inte i drift eftersom funktionerna aldrig returnerar en resultatuppsättning.
gäller för: SQL Server 2012 (11.x) och senare versioner och Azure SQL Database.RESULT SETS NONE
Garanterar att EXECUTE
-instruktionen inte returnerar några resultat. Om några resultat returneras avbryts batchen.
För tolkade skalära användardefinierade funktioner och inbyggda kompilerade skalära användardefinierade funktioner är det här alternativet inte i drift eftersom funktionerna aldrig returnerar en resultatuppsättning.
gäller för: SQL Server 2012 (11.x) och senare versioner och Azure SQL Database.<result_sets_definition>
Ger en garanti för att resultatet kommer tillbaka enligt result_sets_definition
. För instruktioner som returnerar flera resultatuppsättningar anger du flera result_sets_definition avsnitt. Omslut varje result_sets_definition inom parenteser, avgränsade med kommatecken. Mer information finns i<result_sets_definition>
senare i den här artikeln.
Det här alternativet resulterar alltid i ett fel för internt kompilerade, skalära användardefinierade funktioner eftersom funktionerna aldrig returnerar en resultatuppsättning.
gäller för: SQL Server 2012 (11.x) och senare versioner och Azure SQL Database.<result_sets_definition>
beskriver de resultatuppsättningar som returneras av de körda instruktionerna. Satserna iresult_sets_definition
har följande betydelse:Term Definition { column_name data_type
[ COLLATE collation_name ]
[NULL | INTE NULL] }Se följande tabell. db_name Namnet på databasen som innehåller funktionen tabell, vy eller tabellvärde. schema_name Namnet på schemat som äger funktionen tabell, vy eller tabellvärde. table_name | view_name | table_valued_function_name Anger att de kolumner som returneras är de som anges i tabellen, vyn eller tabellvärdefunktionen med namnet. Tabellvariabler, temporära tabeller och synonymer stöds inte i AS-objektsyntaxen. AS TYPE [ schema_name. ]table_type_name Anger att de kolumner som returneras är de som anges i tabelltypen. AS FÖR XML Anger att XML-resultatet från instruktionen eller den lagrade procedur som anropas av EXECUTE
-instruktionen konverteras till formatet som om de producerades av enSELECT ... FOR XML ...
-instruktion. All formatering från typdirektiven i den ursprungliga instruktionen tas bort och resultatet som returneras är som om inget typdirektiv angavs. AS FOR XML konverterar inte icke-XML-tabellresultat från den körda instruktionen eller den lagrade proceduren till XML.Term Definition column_name Namnen på varje kolumn. Om antalet kolumner skiljer sig från resultatuppsättningen uppstår ett fel och batchen avbryts. Om namnet på en kolumn skiljer sig från resultatuppsättningen anges kolumnnamnet som returneras till det definierade namnet. data_type Datatyperna för varje kolumn. Om datatyperna skiljer sig åt utförs en implicit konvertering till den definierade datatypen. Om konverteringen misslyckas avbryts batchen SORTERA COLLATION_NAME Sortering av varje kolumn. Om det finns ett matchningsfel för sorteringen görs ett implicit sorteringsförsök. Om det misslyckas avbryts batchen. NULL | INTE NULL Nullbarheten för varje kolumn. Om den definierade nullabilityen är NOT NULL
och de data som returneras innehåller nulls uppstår ett fel och batchen avbryts. Om det inte anges överensstämmer standardvärdet med inställningen för alternativenANSI_NULL_DFLT_ON
ochANSI_NULL_DFLT_OFF
.Den faktiska resultatuppsättningen som returneras under körningen kan skilja sig från det resultat som definieras med hjälp av
WITH RESULT SETS
-satsen på något av följande sätt: antal resultatuppsättningar, antal kolumner, kolumnnamn, nullabilitet och datatyp. Om antalet resultatuppsättningar skiljer sig åt uppstår ett fel och batchen avbryts.
Anmärkningar
Parametrar kan anges antingen med hjälp av värde eller med hjälp av @parameter_name = värde. En parameter är inte en del av en transaktion. Om en parameter ändras i en transaktion som senare återställs återgår därför värdet för parametern inte till det tidigare värdet. Värdet som returneras till anroparen är alltid värdet när modulen returneras.
Kapsling sker när en modul anropar en annan eller kör hanterad kod genom att referera till en CLR-modul (Common Language Runtime), användardefinierad typ eller aggregering. Kapslingsnivån ökar när den anropade modulen eller den hanterade kodreferensen startar körningen och minskar när den anropade modulen eller referensen för hanterad kod slutförs. Om du överskrider maximalt 32 kapslingsnivåer misslyckas den fullständiga anropskedjan. Den aktuella kapslingsnivån lagras i @@NESTLEVEL
-systemfunktionen.
Eftersom fjärranslutna lagrade procedurer och utökade lagrade procedurer inte omfattas av en transaktion (om de inte utfärdas inom en BEGIN DISTRIBUTED TRANSACTION
-instruktion eller när de används med olika konfigurationsalternativ), kan kommandon som körs via anrop till dem inte återställas. Mer information finns i System lagrade procedurer och BEGIN DISTRIBUTED TRANSACTION.
När du använder markörvariabler uppstår ett fel om du kör en procedur som skickar en markörvariabel med en markör allokerad till den.
Du behöver inte ange nyckelordet EXECUTE
när du kör moduler om -instruktionen är den första i en batch.
Mer information som är specifik för CLR-lagrade procedurer finns i CLR-lagrade procedurer.
Använda EXECUTE med lagrade procedurer
Du behöver inte ange nyckelordet EXECUTE
när du kör lagrade procedurer när -instruktionen är den första i en batch.
Lagrade procedurer för SQL Server-systemet börjar med tecknen sp_
. De lagras fysiskt i Resource Database, men visas logiskt i sys-schemat för varje system och användardefinierad databas. När du kör en system lagrad procedur, antingen i en batch eller i en modul, till exempel en användardefinierad lagrad procedur eller funktion, rekommenderar vi att du kvalificerar namnet på den lagrade proceduren med namnet på sys-schemat.
Utökade lagrade procedurer i SQL Server-systemet börjar med tecknen xp_
, och de finns i dbo-schemat för master
-databasen. När du kör en systemförlängd lagrad procedur, antingen i en batch eller i en modul, till exempel en användardefinierad lagrad procedur eller funktion, rekommenderar vi att du kvalificerar namnet på den lagrade proceduren med master.dbo
.
När du kör en användardefinierad lagrad procedur, antingen i en batch eller i en modul, till exempel en användardefinierad lagrad procedur eller funktion, rekommenderar vi att du kvalificerar det lagrade procedurnamnet med ett schemanamn. Vi rekommenderar inte att du namnger en användardefinierad lagrad procedur med samma namn som en system lagrad procedur. Mer information om hur du kör lagrade procedurer finns i Kör en lagrad procedur.
Använda EXECUTE med en teckensträng
I SQL Server kan varchar(max) och nvarchar(max) datatyper anges som gör att teckensträngar kan vara upp till 2 gigabyte data.
Ändringar i databaskontexten varar endast till slutet av EXECUTE
-instruktionen. När till exempel EXECUTE
i följande instruktion har körts är databaskontexten master
.
USE master;
EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Kontextväxling
Du kan använda AS { LOGIN | USER } = '<name>'
-satsen för att växla körningskontexten för en dynamisk instruktion. När kontextväxeln anges som EXECUTE ('string') AS <context_specification>
begränsas varaktigheten för kontextväxeln till omfånget för frågan som körs.
Ange ett användar- eller inloggningsnamn
Det användar- eller inloggningsnamn som anges i AS { LOGIN | USER } = '<name>'
måste finnas som huvudnamn i sys.database_principals
respektive sys.server_principals
, annars misslyckas instruktionen. Dessutom måste IMPERSONATE
behörigheter beviljas för huvudkontot. Om anroparen inte är databasägare eller är medlem i sysadmin fast serverroll, måste huvudkontot finnas även när användaren kommer åt databasen eller instansen av SQL Server via ett Windows-gruppmedlemskap. Anta till exempel följande villkor:
CompanyDomain\SQLUsers
grupp har åtkomst tillSales
-databasen.CompanyDomain\SqlUser1
är medlem iSQLUsers
och har därför implicit åtkomst tillSales
-databasen.
Även om CompanyDomain\SqlUser1
har åtkomst till databasen via medlemskap i gruppen SQLUsers
misslyckas instruktionen EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
eftersom CompanyDomain\SqlUser1
inte finns som huvudnamn i databasen.
Metodtips
Ange en inloggning eller användare som har minst behörighet för att utföra de åtgärder som definieras i instruktionen eller modulen. Ange till exempel inte ett inloggningsnamn, som har behörigheter på servernivå, om endast behörigheter på databasnivå krävs. Eller ange inte ett databasägarkonto om inte dessa behörigheter krävs.
Behörigheter
Behörigheter krävs inte för att köra EXECUTE
-instruktionen. Behörigheter krävs dock för de skyddsbara objekt som refereras i EXECUTE
strängen. Om strängen till exempel innehåller en INSERT
-instruktion måste anroparen för EXECUTE
-instruktionen ha INSERT
behörighet i måltabellen. Behörigheter kontrolleras när EXECUTE
-instruktionen påträffas, även om EXECUTE
-instruktionen ingår i en modul.
EXECUTE
behörigheter för en modul som standard till ägaren av modulen, som kan överföra dem till andra användare. När en modul körs som kör en sträng kontrolleras behörigheter i kontexten för den användare som kör modulen, inte i kontexten för den användare som skapade modulen. Men om samma användare äger den anropande modulen och modulen anropas utförs inte EXECUTE
behörighetskontroll för den andra modulen.
Om modulen kommer åt andra databasobjekt lyckas körningen när du har EXECUTE
behörighet för modulen och något av följande villkor är sant:
Modulen är markerad
EXECUTE AS USER
ellerEXECUTE AS SELF
och modulägaren har motsvarande behörigheter för det refererade objektet. Mer information om personifiering i en modul finns i EXECUTE AS-sats.Modulen är markerad
EXECUTE AS CALLER
och du har motsvarande behörigheter för objektet.Modulen är markerad
EXECUTE AS <user_name>
och<user_name>
har motsvarande behörigheter för objektet.
Behörigheter för kontextväxling
Om du vill ange EXECUTE AS
vid en inloggning måste anroparen ha IMPERSONATE
behörigheter för det angivna inloggningsnamnet. Om du vill ange EXECUTE AS
för en databasanvändare måste anroparen ha IMPERSONATE
behörigheter för det angivna användarnamnet. När ingen körningskontext har angetts eller EXECUTE AS CALLER
anges krävs inte IMPERSONATE
behörigheter.
Exempel: SQL Server
I Transact-SQL kodexempel i den här artikeln används AdventureWorks2022
- eller AdventureWorksDW2022
-exempeldatabasen, som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
A. Använda EXECUTE för att skicka en enskild parameter
Den uspGetEmployeeManagers
lagrade proceduren i databasen AdventureWorks2022 förväntar sig en parameter (@EmployeeID
). I följande exempel körs den uspGetEmployeeManagers
lagrade proceduren med Employee ID 6
som parametervärde.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
Variabeln kan uttryckligen namnges i körningen:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Om följande är den första instruktionen i en batch eller ett sqlcmd- skript krävs inte EXECUTE
.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Använda flera parametrar
I följande exempel körs den spGetWhereUsedProductID
lagrade proceduren i databasen AdventureWorks2022. Den skickar två parametrar: den första parametern är ett produkt-ID (819
) och den andra parametern @CheckDate
är ett datetime- värde.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Använda EXECUTE "tsql_string" med en variabel
I följande exempel visas hur EXECUTE
hanterar dynamiskt byggda strängar som innehåller variabler. I det här exemplet skapas markören tables_cursor
för att lagra en lista över alla användardefinierade tabeller i AdventureWorks2022
-databasen och använder sedan listan för att återskapa alla index i tabellerna.
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. Använda EXECUTE med en fjärr lagrad procedur
I följande exempel körs den uspGetEmployeeManagers
lagrade proceduren på fjärrservern SQLSERVER1
och lagrar returstatusen som anger lyckad eller misslyckad i @retstat
.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. Använda EXECUTE med en lagrad procedurvariabel
I följande exempel skapas en variabel som representerar ett lagrat procedurnamn.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. Använd EXECUTE med DEFAULT
I följande exempel skapas en lagrad procedur med standardvärden för de första och tredje parametrarna. När proceduren körs infogas dessa standardvärden för de första och tredje parametrarna när inget värde skickas i anropet eller när standardvärdet anges. Observera de olika sätt som nyckelordet DEFAULT
kan användas på.
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
Den Proc_Test_Defaults
lagrade proceduren kan köras i många kombinationer.
-- 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. Använda EXECUTE med AT linked_server_name
I följande exempel skickas en kommandosträng till en fjärrserver. Den skapar en länkad server SeattleSales
som pekar på en annan instans av SQL Server och kör en DDL-instruktion (CREATE TABLE
) mot den länkade servern.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. Använda EXECUTE MED RECOMPILE
I följande exempel körs den Proc_Test_Defaults
lagrade proceduren och tvingar fram en ny frågeplan som ska kompileras, användas och ignoreras när modulen har körts.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
Jag. Använda EXECUTE med en användardefinierad funktion
I följande exempel körs den ufnGetSalesOrderStatusText
skalär användardefinierade funktionen i databasen AdventureWorks2022. Den använder variabeln @returnstatus
för att lagra värdet som returneras av funktionen. Funktionen förväntar sig en indataparameter, @Status
. Detta definieras som en liten datatyp.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. Använda EXECUTE för att fråga en Oracle-databas på en länkad server
I följande exempel körs flera SELECT
-instruktioner på den fjärranslutna Oracle-servern. Exemplet börjar med att lägga till Oracle-servern som en länkad server och skapa en länkad serverinloggning.
-- 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. Använd EXECUTE AS USER för att växla kontext till en annan användare
I följande exempel körs en Transact-SQL sträng som skapar en tabell och anger AS USER
-satsen för att växla körningskontexten för -instruktionen från anroparen till User1
. Databasmotorn kontrollerar behörigheterna för User1
när -instruktionen körs.
User1
måste finnas som användare i databasen och måste ha behörighet att skapa tabeller i Sales
schema, annars misslyckas instruktionen.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
L. Använda en parameter med EXECUTE och AT linked_server_name
I följande exempel skickas en kommandosträng till en fjärrserver med hjälp av en platshållare för ett frågetecken (?
) för en parameter. Exemplet skapar en länkad server SeattleSales
som pekar på en annan instans av SQL Server och kör en SELECT
-instruktion mot den länkade servern.
SELECT
-instruktionen använder frågetecknet som platshållare för parametern ProductID
(952
), som tillhandahålls efter instruktionen.
-- 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. Använda EXECUTE för att omdefiniera en enskild resultatuppsättning
gäller för: SQL Server 2012 (11.x) och senare versioner och Azure SQL Database.
Några av de tidigare exemplen kördes EXECUTE dbo.uspGetEmployeeManagers 6;
som returnerade sju kolumner. I följande exempel visas hur du använder syntaxen WITH RESULT SET
för att ändra namn och datatyper för den returnerade resultatuppsättningen.
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. Använda EXECUTE för att omdefiniera två resultatuppsättningar
gäller för: SQL Server 2012 (11.x) och senare versioner och Azure SQL Database.
När du kör en instruktion som returnerar mer än en resultatuppsättning definierar du varje förväntad resultatuppsättning. I följande exempel i AdventureWorks2022
skapas en procedur som returnerar två resultatuppsättningar. Sedan körs proceduren med hjälp av WITH RESULT SETS
-satsen och anger två definitioner för resultatuppsättningar.
--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. Använda EXECUTE med AT DATA_SOURCE data_source_name för att köra frågor mot en fjärransluten SQL Server
gäller för: SQL Server 2019 (15.x) och senare versioner.
I följande exempel skickas en kommandosträng till en extern datakälla som pekar på en SQL Server-instans.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Använd EXECUTE med AT DATA_SOURCE data_source_name för att köra frågor mot beräkningspoolen i SQL Server Big Data Cluster
gäller för: SQL Server 2019 (15.x).
I följande exempel skickas en kommandosträng till en extern datakälla som pekar på en beräkningspool i SQL Server Big Data Cluster. Exemplet skapar en datakälla SqlComputePool
mot en beräkningspool i SQL Server Big Data Cluster och kör en SELECT
-instruktion mot datakällan.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Använd EXECUTE med AT DATA_SOURCE data_source_name för att köra frågor mot datapoolen i SQL Server Big Data Cluster
gäller för: SQL Server 2019 (15.x).
I följande exempel skickas en kommandosträng till en extern datakälla som pekar på beräkningspoolen i SQL Server Big Data Cluster (BDC). Exemplet skapar en datakälla SqlDataPool
mot en datapool i BDC och kör en SELECT
-instruktion mot datakällan.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
R. Använda EXECUTE med AT DATA_SOURCE data_source_name för att köra frågor mot lagringspoolen i SQL Server Big Data Cluster
gäller för: SQL Server 2019 (15.x).
I följande exempel skickas en kommandosträng till en extern datakälla som pekar på beräkningspoolen i SQL Server Big Data Cluster. Exemplet skapar en datakälla SqlStoragePool
mot en datapool i SQL Server Big Data Cluster och kör en SELECT
-instruktion mot datakällan.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Exempel: Azure Synapse Analytics
I Transact-SQL kodexempel i den här artikeln används AdventureWorks2022
- eller AdventureWorksDW2022
-exempeldatabasen, som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
S: Körning av grundläggande procedur
Kör en lagrad procedur:
EXECUTE proc1;
Anropa en lagrad procedur med namnet som fastställs vid körning:
EXECUTE ('EXECUTE ' + @var);
Anropa en lagrad procedur inifrån en lagrad procedur:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Kör strängar
Kör en SQL-sträng:
EXECUTE ('SELECT * FROM sys.types');
Kör en kapslad sträng:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Kör en strängvariabel:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Procedurer med parametrar
I följande exempel skapas en procedur med parametrar och tre sätt att utföra proceduren:
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
Kör med hjälp av positionsparametrar:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Kör med namngivna parametrar i ordning:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Kör med namngivna parametrar i fel ordning:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Relaterat innehåll
- @@NESTLEVEL (Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- EXECUTE AS-satsen (Transact-SQL)
- osql Utility
- huvudnamn (databasmotor)
- REVERT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- sqlcmd Utility
- SUSER_NAME (Transact-SQL)
- sys.database_principals (Transact-SQL)
- sys.server_principals (Transact-SQL)
- USER_NAME (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- Scalar User-Defined Functions för In-Memory OLTP-