Delen via


EXECUTE (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft FabricSQL-database in Microsoft Fabric

Voert een opdrachttekenreeks of tekenreeks uit binnen een Transact-SQL batch of een van de volgende modules: door het systeem opgeslagen procedure, door de gebruiker gedefinieerde opgeslagen procedure, CLR-opgeslagen procedure, door de gebruiker gedefinieerde functie of uitgebreide opgeslagen procedure. De instructie EXEC of EXECUTE kan worden gebruikt om passthrough-opdrachten naar gekoppelde servers te verzenden. Daarnaast kan de context waarin een tekenreeks of opdracht wordt uitgevoerd expliciet worden ingesteld. Metagegevens voor de resultatenset kunnen worden gedefinieerd met behulp van de WITH RESULT SETS opties.

Belangrijk

Voordat u EXECUTE aanroept met een tekenreeks, valideert u de tekenreeks. Voer nooit een opdracht uit die is samengesteld op basis van gebruikersinvoer die niet is gevalideerd.

Transact-SQL syntaxisconventies

Syntaxis

In het volgende codeblok ziet u de syntaxis in SQL Server 2019 (15.x) en latere versies. U kunt ook syntaxis bekijken in SQL Server 2017 en eerder.

Syntaxis voor SQL Server 2019 en latere versies.

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

In het volgende codeblok ziet u de syntaxis in SQL Server 2017 (14.x) en eerdere versies. U kunt ook syntaxis bekijken in SQL Server 2019.

Syntaxis voor SQL Server 2017 en eerdere versies.

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

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

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

Syntaxis voor Azure Synapse Analytics en 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 ] )
[ ; ]

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

Argumenten

@return_status

Een optionele geheel getalvariabele waarmee de retourstatus van een module wordt opgeslagen. Deze variabele moet worden gedeclareerd in de batch, opgeslagen procedure of functie voordat deze wordt gebruikt in een EXECUTE-instructie.

Wanneer deze wordt gebruikt om een door de gebruiker gedefinieerde functie scalaire waarden aan te roepen, kan de @return_status variabele van elk scalaire gegevenstype zijn.

module_name

De volledig gekwalificeerde of niet-gekwalificeerde naam van de opgeslagen procedure of scalaire door de gebruiker gedefinieerde functie die moet worden aangeroepen. Modulenamen moeten voldoen aan de regels voor id's. De namen van uitgebreide opgeslagen procedures zijn altijd hoofdlettergevoelig, ongeacht de sortering van de server.

Een module die in een andere database is gemaakt, kan worden uitgevoerd als de gebruiker die de module uitvoert eigenaar is van de module, of de juiste machtiging heeft om deze in die database uit te voeren. Een module kan worden uitgevoerd op een andere server waarop SQL Server wordt uitgevoerd als de gebruiker die de module uitvoert, de juiste machtiging heeft om die server (externe toegang) te gebruiken en de module in die database uit te voeren. Als er een servernaam is opgegeven maar er geen databasenaam is opgegeven, zoekt de SQL Server Database Engine naar de module in de standaarddatabase van de gebruiker.

;getal

Een optioneel geheel getal dat wordt gebruikt om procedures van dezelfde naam te groeperen. Deze parameter wordt niet gebruikt voor uitgebreide opgeslagen procedures.

Notitie

Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie.

Zie CREATE PROCEDUREvoor meer informatie over proceduregroepen.

@module_name_var

De naam van een lokaal gedefinieerde variabele die een modulenaam vertegenwoordigt.

Dit kan een variabele zijn die de naam bevat van een systeemeigen gecompileerde, scalaire door de gebruiker gedefinieerde functie.

@parameter

De parameter voor module_name, zoals gedefinieerd in de module. Parameternamen moeten worden voorafgegaan door het at-teken (@). Bij gebruik met de @parameter_name = -waarde formulier hoeven parameternamen en constanten niet te worden opgegeven in de volgorde waarin ze in de module zijn gedefinieerd. Als de @parameter_name = waarde formulier echter wordt gebruikt voor een parameter, moet deze worden gebruikt voor alle volgende parameters.

Parameters zijn standaard null-baar.

waarde

De waarde van de parameter die moet worden doorgegeven aan de module of passthrough-opdracht. Als er geen parameternamen zijn opgegeven, moeten parameterwaarden worden opgegeven in de volgorde die in de module is gedefinieerd.

Wanneer u passthrough-opdrachten uitvoert op gekoppelde servers, is de volgorde van de parameterwaarden afhankelijk van de OLE DB-provider van de gekoppelde server. De meeste OLE DB-providers binden waarden aan parameters van links naar rechts.

Als de waarde van een parameter een objectnaam, tekenreeks of gekwalificeerde databasenaam of schemanaam is, moet de hele naam tussen enkele aanhalingstekens worden geplaatst. Als de waarde van een parameter een trefwoord is, moet het trefwoord tussen dubbele aanhalingstekens worden geplaatst.

Als u één woord doorgeeft dat niet begint met @, dat niet tussen aanhalingstekens staat (bijvoorbeeld als u @ vergeet bij een parameternaam), wordt het woord behandeld als een nvarchar tekenreeks, ondanks de ontbrekende aanhalingstekens.

Als er een standaardwaarde is gedefinieerd in de module, kan een gebruiker de module uitvoeren zonder een parameter op te geven.

De standaardwaarde kan ook worden NULL. Over het algemeen geeft de moduledefinitie de actie op die moet worden uitgevoerd als een parameterwaarde NULL.

@variable

De variabele waarin een parameter of een retourparameter wordt opgeslagen.

UITVOER

Hiermee geeft u op dat de module of opdrachtreeks een parameter retourneert. De overeenkomende parameter in de module of opdrachtreeks moet ook zijn gemaakt met behulp van het trefwoord OUTPUT. Gebruik dit trefwoord wanneer u cursorvariabelen als parameters gebruikt.

Als waarde is gedefinieerd als OUTPUT van een module die wordt uitgevoerd op een gekoppelde server, worden eventuele wijzigingen in de overeenkomende @parameter die door de OLE DB-provider worden uitgevoerd, terug gekopieerd naar de variabele aan het einde van de uitvoering van de module.

Als OUTPUT parameters worden gebruikt en de bedoeling is om de retourwaarden in andere instructies in de aanroepende batch of module te gebruiken, moet de waarde van de parameter worden doorgegeven als een variabele, zoals @parameter = @variable. U kunt een module niet uitvoeren door OUTPUT op te geven voor een parameter die niet is gedefinieerd als een OUTPUT parameter in de module. Constanten kunnen niet worden doorgegeven aan module met behulp van OUTPUT; voor de retourparameter is een variabelenaam vereist. Het gegevenstype van de variabele moet worden gedeclareerd en een waarde toegewezen voordat de procedure wordt uitgevoerd.

Wanneer EXECUTE wordt gebruikt voor een externe opgeslagen procedure of om een passthrough-opdracht uit te voeren op een gekoppelde server, kunnen OUTPUT parameters geen van de gegevenstypen voor grote objecten (LOB) zijn.

Retourparameters kunnen van elk gegevenstype zijn, behalve de LOB-gegevenstypen.

VERSTEK

Levert de standaardwaarde van de parameter zoals gedefinieerd in de module. Wanneer de module een waarde verwacht voor een parameter die geen gedefinieerde standaardwaarde heeft en een parameter ontbreekt of het trefwoord DEFAULT is opgegeven, treedt er een fout op.

@string_variable

De naam van een lokale variabele. @string_variable kan elk tekenzijn, varchar, ncharof nvarchar gegevenstype. Deze omvatten de (max) gegevenstypen.

[N]'tsql_string'

Een constante tekenreeks. tsql_string kan elk nvarchar- of varchar gegevenstype zijn. Als de N is opgenomen, wordt de tekenreeks geïnterpreteerd als nvarchar gegevenstype.

AS-context_specification

Hiermee geeft u de context op waarin de instructie wordt uitgevoerd.

INLOGGEN

Hiermee geeft u de context moet worden geïmiteerd is een aanmelding. Het bereik van imitatie is de server.

GEBRUIKER

Hiermee geeft u de context die moet worden geïmiteerd een gebruiker in de huidige database is. Het bereik van imitatie is beperkt tot de huidige database. Een contextswitch naar een databasegebruiker neemt de machtigingen op serverniveau van die gebruiker niet over.

Belangrijk

Hoewel de context overschakelt naar de databasegebruiker actief is, zorgt elke poging om toegang te krijgen tot resources buiten de database, dat de instructie mislukt. Dit omvat USE <database> instructies, gedistribueerde query's en query's die verwijzen naar een andere database met behulp van drie of vierdelige id's.

'naam'

Een geldige gebruikersnaam of aanmeldingsnaam. Het argument naam moet lid zijn van de sysadmin vaste serverfunctie of bestaan als principal in respectievelijk sys.database_principals of sys.server_principals.

Dit argument kan geen ingebouwd account zijn, zoals NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServiceof NT AUTHORITY\LocalSystem.

Zie Een gebruikersnaam of aanmeldingsnaam opgeven verderop in dit artikel voor meer informatie.

[N]'command_string'

Een constante tekenreeks die de opdracht bevat die moet worden doorgegeven aan de gekoppelde server. Als de N is opgenomen, wordt de tekenreeks geïnterpreteerd als nvarchar gegevenstype.

[?]

Geeft parameters aan waarvoor waarden worden opgegeven in de <arg-list> van passthrough-opdrachten die worden gebruikt in een EXECUTE ('...', <arg-list>) AT <linkedsrv>-instructie.

AT linked_server_name

Hiermee geeft u op dat command_string wordt uitgevoerd op basis van linked_server_name en resultaten, indien aanwezig, worden geretourneerd naar de client. linked_server_name moet verwijzen naar een bestaande definitie van een gekoppelde server op de lokale server. Gekoppelde servers worden gedefinieerd met behulp van sp_addlinkedserver.

  • WITH <execute_option>

    Mogelijke uitvoeropties. De RESULT SETS-opties kunnen niet worden opgegeven in een INSERT...EXECUTE-instructie.

AT DATA_SOURCE data_source_name

van toepassing op: SQL Server 2019 (15.x) en latere versies.

Hiermee geeft u op dat command_string wordt uitgevoerd op basis van data_source_name en resultaten, indien aanwezig, worden geretourneerd naar de client. data_source_name moet verwijzen naar een bestaande EXTERNAL DATA SOURCE definitie in de database. Alleen gegevensbronnen die naar SQL Server verwijzen, worden ondersteund. Daarnaast worden gegevensbronnen voor big dataclusters van SQL Server die verwijzen naar rekengroep, gegevensgroep of opslaggroep ondersteund. Gegevensbronnen worden gedefinieerd met behulp van CREATE EXTERNAL DATA SOURCE.

  • WITH <execute_option>

    Mogelijke uitvoeropties. De RESULT SETS-opties kunnen niet worden opgegeven in een INSERT...EXECUTE-instructie.

    Term Definitie
    RECOMPILE Hiermee wordt een nieuw plan gecompileerd, gebruikt en verwijderd nadat de module is uitgevoerd. Als er een bestaand queryplan voor de module is, blijft dit plan in de cache.

    Gebruik deze optie als de parameter die u opgeeft atypisch is of als de gegevens aanzienlijk zijn gewijzigd. Deze optie wordt niet gebruikt voor uitgebreide opgeslagen procedures. We raden u aan deze optie spaarzaam te gebruiken omdat het duur is.

    Opmerking: U kunt WITH RECOMPILE niet gebruiken bij het aanroepen van een opgeslagen procedure die gebruikmaakt van OPENDATASOURCE syntaxis. De optie WITH RECOMPILE wordt genegeerd wanneer een vierdelige objectnaam is opgegeven.

    Opmerking:RECOMPILE wordt niet ondersteund met systeemeigen gecompileerde, scalaire door de gebruiker gedefinieerde functies. Als u opnieuw wilt compileren, gebruikt u sp_recompile.
    RESULT SETS UNDEFINED Deze optie biedt geen garantie voor welke resultaten, indien aanwezig, worden geretourneerd en er geen definitie wordt opgegeven. De instructie wordt zonder fouten uitgevoerd als er resultaten worden geretourneerd of er geen resultaten worden geretourneerd. RESULT SETS UNDEFINED is het standaardgedrag als er geen result_sets_option is opgegeven.

    Voor geïnterpreteerde door de gebruiker gedefinieerde functies en systeemeigen gecompileerde scalaire door de gebruiker gedefinieerde functies is deze optie niet operationeel omdat de functies nooit een resultatenset retourneren.

    van toepassing op: SQL Server 2012 (11.x) en latere versies en Azure SQL Database.
    RESULT SETS NONE Garandeert dat de EXECUTE-instructie geen resultaten retourneert. Als er resultaten worden geretourneerd, wordt de batch afgebroken.

    Voor geïnterpreteerde door de gebruiker gedefinieerde functies en systeemeigen gecompileerde scalaire door de gebruiker gedefinieerde functies is deze optie niet operationeel omdat de functies nooit een resultatenset retourneren.

    van toepassing op: SQL Server 2012 (11.x) en latere versies en Azure SQL Database.
    <result_sets_definition> Biedt een garantie dat het resultaat terugkomt zoals opgegeven in de result_sets_definition. Voor instructies die meerdere resultatensets retourneren, geeft u meerdere result_sets_definition secties op. Plaats elke result_sets_definition tussen haakjes, gescheiden door komma's. Zie <result_sets_definition> verderop in dit artikel voor meer informatie.

    Deze optie resulteert altijd in een fout voor systeemeigen gecompileerde, scalaire door de gebruiker gedefinieerde functies, omdat de functies nooit een resultatenset retourneren.

    van toepassing op: SQL Server 2012 (11.x) en latere versies en Azure SQL Database.

    <result_sets_definition> beschrijft de resultatensets die worden geretourneerd door de uitgevoerde instructies. De componenten van de result_sets_definition hebben de volgende betekenis:

    Term Definitie
    { column_name data_type
    [ SORTEREN collation_name ]
    [NULL | NOT NULL] }
    Zie de volgende tabel.
    db_name De naam van de database met de functie tabel, weergave of tabelwaarde.
    schema_name De naam van het schema dat eigenaar is van de functie tabel, weergave of tabelwaarde.
    table_name | view_name | table_valued_function_name Hiermee geeft u op dat de geretourneerde kolommen zijn die zijn opgegeven in de tabel-, weergave- of tabelwaardefunctie met de naam. Tabelvariabelen, tijdelijke tabellen en synoniemen worden niet ondersteund in de syntaxis van het AS-object.
    AS TYPE [ schema_name. ]table_type_name Hiermee geeft u op dat de geretourneerde kolommen zijn die zijn opgegeven in het tabeltype.
    AS FOR XML Hiermee geeft u op dat de XML-resultaten van de instructie of opgeslagen procedure die door de EXECUTE instructie worden aangeroepen, worden geconverteerd naar de indeling alsof ze zijn geproduceerd door een SELECT ... FOR XML ... instructie. Alle opmaak van de typerichtlijnen in de oorspronkelijke instructie wordt verwijderd en de geretourneerde resultaten zijn alsof er geen typerichtlijn is opgegeven. AS FOR XML converteert geen niet-XML tabellaire resultaten van de uitgevoerde instructie of opgeslagen procedure naar XML.
    Term Definitie
    column_name De namen van elke kolom. Als het aantal kolommen verschilt van de resultatenset, treedt er een fout op en wordt de batch afgebroken. Als de naam van een kolom verschilt van de resultatenset, wordt de geretourneerde kolomnaam ingesteld op de gedefinieerde naam.
    data_type De gegevenstypen van elke kolom. Als de gegevenstypen verschillen, wordt een impliciete conversie naar het gedefinieerde gegevenstype uitgevoerd. Als de conversie mislukt, wordt de batch afgebroken
    COLLATION_NAME SORTEREN De sortering van elke kolom. Als er een sortering niet overeenkomt, wordt een impliciete sortering geprobeerd. Als dat mislukt, wordt de batch afgebroken.
    NULL | NIET NULL De null-waarde van elke kolom. Als de gedefinieerde null-waarde NOT NULL is en de geretourneerde gegevens null-waarden bevatten, treedt er een fout op en wordt de batch afgebroken. Als deze niet is opgegeven, voldoet de standaardwaarde aan de instelling van de ANSI_NULL_DFLT_ON- en ANSI_NULL_DFLT_OFF-opties.

    De werkelijke resultatenset die tijdens de uitvoering wordt geretourneerd, kan verschillen van het resultaat dat is gedefinieerd met behulp van de WITH RESULT SETS-component op een van de volgende manieren: het aantal resultatensets, het aantal kolommen, de kolomnaam, de null-waarde en het gegevenstype. Als het aantal resultatensets verschilt, treedt er een fout op en wordt de batch afgebroken.

Opmerkingen

Parameters kunnen worden opgegeven met behulp van waarde of met behulp van @parameter_name = waarde. Een parameter maakt geen deel uit van een transactie; Als een parameter daarom wordt gewijzigd in een transactie die later wordt teruggedraaid, wordt de waarde van de parameter niet teruggezet naar de vorige waarde. De waarde die naar de aanroeper wordt geretourneerd, is altijd de waarde op het moment dat de module wordt geretourneerd.

Nesten vindt plaats wanneer een module een andere aanroept of beheerde code uitvoert door te verwijzen naar een CLR-module (Common Language Runtime), door de gebruiker gedefinieerd type of aggregatie. Het nestniveau wordt verhoogd wanneer de aangeroepen module- of beheerde codeverwijzing wordt gestart en afneemt wanneer de aangeroepen module- of beheerde codeverwijzing is voltooid. Als u het maximum van 32 nestniveaus overschrijdt, mislukt de volledige aanroepketen. Het huidige nestniveau wordt opgeslagen in de @@NESTLEVEL systeemfunctie.

Omdat externe opgeslagen procedures en uitgebreide opgeslagen procedures niet binnen het bereik van een transactie vallen (tenzij ze zijn uitgegeven binnen een BEGIN DISTRIBUTED TRANSACTION instructie of wanneer ze worden gebruikt met verschillende configuratieopties), kunnen opdrachten die worden uitgevoerd via aanroepen, niet worden teruggedraaid. Zie System stored procedures en BEGIN DISTRIBUTED TRANSACTIONvoor meer informatie.

Wanneer u cursorvariabelen gebruikt, treedt er een fout op als u een procedure uitvoert die een cursorvariabele doorgeeft waaraan een cursor is toegewezen.

U hoeft het EXECUTE trefwoord niet op te geven bij het uitvoeren van modules als de instructie de eerste in een batch is.

Zie CLR Stored Proceduresvoor meer informatie over opgeslagen CLR-procedures.

EXECUTE gebruiken met opgeslagen procedures

U hoeft het EXECUTE trefwoord niet op te geven wanneer u opgeslagen procedures uitvoert wanneer de instructie de eerste in een batch is.

Opgeslagen procedures van het SQL Server-systeem beginnen met de tekens sp_. Ze worden fysiek opgeslagen in de resourcedatabase, maar worden logisch weergegeven in het sys-schema van elke door het systeem en de gebruiker gedefinieerde database. Wanneer u een door het systeem opgeslagen procedure uitvoert, in een batch of in een module, zoals een door de gebruiker gedefinieerde opgeslagen procedure of functie, raden we u aan om de naam van de opgeslagen procedure in aanmerking te laten komen met de sys-schemanaam.

Uitgebreide opgeslagen procedures van het SQL Server-systeem beginnen met de tekens xp_en deze zijn opgenomen in het dbo-schema van de master-database. Wanneer u een door het systeem uitgebreide opgeslagen procedure uitvoert, hetzij in een batch of in een module zoals een door de gebruiker gedefinieerde opgeslagen procedure of functie, wordt u aangeraden de naam van de opgeslagen procedure in aanmerking te laten komen met master.dbo.

Wanneer u een door de gebruiker gedefinieerde opgeslagen procedure uitvoert, in een batch of in een module, zoals een door de gebruiker gedefinieerde opgeslagen procedure of functie, wordt u aangeraden de naam van de opgeslagen procedure in aanmerking te laten komen met een schemanaam. Het is niet raadzaam om een door de gebruiker gedefinieerde opgeslagen procedure een naam te geven met dezelfde naam als een door het systeem opgeslagen procedure. Zie Een opgeslagen procedure uitvoerenvoor meer informatie over het uitvoeren van opgeslagen procedures.

EXECUTE gebruiken met een tekenreeks

In SQL Server kunnen de varchar(max) en nvarchar(max) gegevenstypen worden opgegeven waarmee tekenreeksen maximaal 2 gigabyte aan gegevens kunnen zijn.

Wijzigingen in databasecontext duren pas tot het einde van de EXECUTE-instructie. Nadat de EXECUTE in deze volgende instructie bijvoorbeeld is uitgevoerd, wordt de databasecontext master.

USE master;

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

Contextwisseling

U kunt de AS { LOGIN | USER } = '<name>'-component gebruiken om de uitvoeringscontext van een dynamische instructie over te schakelen. Wanneer de contextswitch wordt opgegeven als EXECUTE ('string') AS <context_specification>, is de duur van de contextswitch beperkt tot het bereik van de query die wordt uitgevoerd.

Een gebruikersnaam of aanmeldingsnaam opgeven

De in AS { LOGIN | USER } = '<name>' opgegeven gebruikersnaam of aanmeldingsnaam moet bestaan als principal in respectievelijk sys.database_principals of sys.server_principals, of als de instructie mislukt. Daarnaast moeten IMPERSONATE machtigingen worden verleend aan de principal. Tenzij de aanroeper de eigenaar van de database is of lid is van de sysadmin vaste serverfunctie, moet de principal bestaan, zelfs wanneer de gebruiker via een Windows-groepslidmaatschap toegang heeft tot de database of het exemplaar van SQL Server. Stel bijvoorbeeld dat u de volgende voorwaarden hebt:

  • CompanyDomain\SQLUsers groep heeft toegang tot de Sales-database.

  • CompanyDomain\SqlUser1 lid is van SQLUsers en heeft daarom impliciete toegang tot de Sales-database.

Hoewel CompanyDomain\SqlUser1 toegang heeft tot de database via lidmaatschap van de SQLUsers groep, mislukt de instructie EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' omdat CompanyDomain\SqlUser1 niet bestaat als principal in de database.

Aanbevolen procedures

Geef een aanmelding of gebruiker op met de minste bevoegdheden die nodig zijn om de bewerkingen uit te voeren die zijn gedefinieerd in de instructie of module. Geef bijvoorbeeld geen aanmeldingsnaam op, die machtigingen op serverniveau heeft, als alleen machtigingen op databaseniveau zijn vereist. Of geef geen account voor de database-eigenaar op, tenzij deze machtigingen zijn vereist.

Machtigingen

Machtigingen zijn niet vereist om de EXECUTE-instructie uit te voeren. Machtigingen zijn echter vereist voor de beveiligbare objecten waarnaar wordt verwezen in de EXECUTE tekenreeks. Als de tekenreeks bijvoorbeeld een INSERT instructie bevat, moet de aanroeper van de EXECUTE-instructie INSERT machtiging hebben voor de doeltabel. Machtigingen worden gecontroleerd op het moment dat EXECUTE instructie wordt aangetroffen, zelfs als de EXECUTE instructie is opgenomen in een module.

EXECUTE machtigingen voor een module zijn standaard de eigenaar van de module, die ze naar andere gebruikers kan overdragen. Wanneer een module wordt uitgevoerd die een tekenreeks uitvoert, worden machtigingen gecontroleerd in de context van de gebruiker die de module uitvoert, niet in de context van de gebruiker die de module heeft gemaakt. Als dezelfde gebruiker echter eigenaar is van de aanroepende module en de module die wordt aangeroepen, wordt EXECUTE machtigingscontrole niet uitgevoerd voor de tweede module.

Als de module toegang heeft tot andere databaseobjecten, slaagt de uitvoering wanneer u EXECUTE machtiging voor de module hebt en een van de volgende voorwaarden waar is:

  • De module is gemarkeerd als EXECUTE AS USER of EXECUTE AS SELFen de eigenaar van de module heeft de bijbehorende machtigingen voor het object waarnaar wordt verwezen. Zie EXECUTE AS-componentvoor meer informatie over imitatie binnen een module.

  • De module is gemarkeerd als EXECUTE AS CALLERen u beschikt over de bijbehorende machtigingen voor het object.

  • De module is gemarkeerd als EXECUTE AS <user_name>en <user_name> beschikt over de bijbehorende machtigingen voor het object.

Machtigingen voor het schakelen tussen contexten

Als u EXECUTE AS wilt opgeven voor een aanmelding, moet de beller IMPERSONATE machtigingen hebben voor de opgegeven aanmeldingsnaam. Als u EXECUTE AS wilt opgeven voor een databasegebruiker, moet de beller IMPERSONATE machtigingen hebben voor de opgegeven gebruikersnaam. Wanneer er geen uitvoeringscontext is opgegeven of EXECUTE AS CALLER is opgegeven, zijn IMPERSONATE machtigingen niet vereist.

Voorbeelden: SQL Server

De Transact-SQL codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

Een. EXECUTE gebruiken om één parameter door te geven

De uspGetEmployeeManagers opgeslagen procedure in de Database AdventureWorks2022 verwacht één parameter (@EmployeeID). In de volgende voorbeelden wordt de uspGetEmployeeManagers opgeslagen procedure uitgevoerd met Employee ID 6 als parameterwaarde.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

De variabele kan expliciet worden benoemd in de uitvoering:

EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Als het volgende de eerste instructie is in een batch of een sqlcmd script, is EXECUTE niet vereist.

dbo.uspGetEmployeeManagers 6;
GO

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

B. Meerdere parameters gebruiken

In het volgende voorbeeld wordt de spGetWhereUsedProductID opgeslagen procedure uitgevoerd in de AdventureWorks2022-database. Er worden twee parameters doorgegeven: de eerste parameter is een product-id (819) en de tweede parameter @CheckDate een datum/tijd- waarde is.

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

EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

C. EXECUTE tsql_string gebruiken met een variabele

In het volgende voorbeeld ziet u hoe EXECUTE dynamisch gebouwde tekenreeksen verwerkt die variabelen bevatten. In dit voorbeeld wordt de tables_cursor cursor gemaakt voor het opslaan van een lijst met alle door de gebruiker gedefinieerde tabellen in de AdventureWorks2022-database. Vervolgens wordt die lijst gebruikt om alle indexen in de tabellen opnieuw op te bouwen.

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. EXECUTE gebruiken met een externe opgeslagen procedure

In het volgende voorbeeld wordt de uspGetEmployeeManagers opgeslagen procedure uitgevoerd op de externe server SQLSERVER1 en wordt de retourstatus opgeslagen die aangeeft dat de @retstatis geslaagd of mislukt.

DECLARE @retstat AS INT;

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

E. EXECUTE gebruiken met een opgeslagen procedurevariabele

In het volgende voorbeeld wordt een variabele gemaakt die een opgeslagen procedurenaam vertegenwoordigt.

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

EXECUTE @proc_name;

F. EXECUTE gebruiken met STANDAARD

In het volgende voorbeeld wordt een opgeslagen procedure gemaakt met standaardwaarden voor de eerste en derde parameters. Wanneer de procedure wordt uitgevoerd, worden deze standaardwaarden ingevoegd voor de eerste en derde parameters wanneer er geen waarde wordt doorgegeven in de aanroep of wanneer de standaardwaarde is opgegeven. Let op de verschillende manieren waarop het DEFAULT trefwoord kan worden gebruikt.

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

De Proc_Test_Defaults opgeslagen procedure kan in veel combinaties worden uitgevoerd.

-- 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. EXECUTE gebruiken met AT linked_server_name

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe server. Er wordt een gekoppelde server gemaakt SeattleSales die verwijst naar een ander exemplaar van SQL Server en een DDL-instructie (CREATE TABLE) uitvoert op die gekoppelde server.

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

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

H. EXECUTE GEBRUIKEN MET OPNIEUW COMPILEREN

In het volgende voorbeeld wordt de Proc_Test_Defaults opgeslagen procedure uitgevoerd en wordt een nieuw queryplan gecompileerd, gebruikt en verwijderd nadat de module is uitgevoerd.

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

Ik. EXECUTE gebruiken met een door de gebruiker gedefinieerde functie

In het volgende voorbeeld wordt de door de gebruiker gedefinieerde ufnGetSalesOrderStatusText scalaire functie uitgevoerd in de Database AdventureWorks2022. Hierbij wordt de variabele @returnstatus gebruikt om de waarde op te slaan die door de functie wordt geretourneerd. De functie verwacht één invoerparameter, @Status. Dit wordt gedefinieerd als een kleine gegevenstype.

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

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

PRINT @returnstatus;
GO

J. EXECUTE gebruiken om een query uit te voeren op een Oracle-database op een gekoppelde server

In het volgende voorbeeld worden verschillende SELECT instructies uitgevoerd op de externe Oracle-server. Het voorbeeld begint met het toevoegen van de Oracle-server als een gekoppelde server en het maken van aanmelding bij een gekoppelde server.

-- 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. EXECUTE AS USER gebruiken om over te schakelen naar een andere gebruiker

In het volgende voorbeeld wordt een Transact-SQL tekenreeks uitgevoerd waarmee een tabel wordt gemaakt en wordt de AS USER component opgegeven om de uitvoeringscontext van de instructie van de aanroeper over te schakelen naar User1. De database-engine controleert de machtigingen van User1 wanneer de instructie wordt uitgevoerd. User1 moet bestaan als gebruiker in de database en moet gemachtigd zijn om tabellen te maken in het Sales schema of de instructie mislukt.

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

L. Een parameter gebruiken met EXECUTE en AT linked_server_name

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe server met behulp van een vraagteken (?) voor een parameter. In het voorbeeld wordt een gekoppelde server gemaakt SeattleSales die verwijst naar een ander exemplaar van SQL Server en een SELECT instructie uitvoert op die gekoppelde server. De SELECT-instructie gebruikt het vraagteken als tijdelijke aanduiding voor de parameter ProductID (952), die na de instructie wordt verstrekt.

-- 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. EXECUTE gebruiken om één resultatenset opnieuw te definiëren

van toepassing op: SQL Server 2012 (11.x) en latere versies en Azure SQL Database.

Sommige van de vorige voorbeelden hebben EXECUTE dbo.uspGetEmployeeManagers 6; uitgevoerd die zeven kolommen hebben geretourneerd. In het volgende voorbeeld ziet u hoe u de syntaxis van de WITH RESULT SET gebruikt om de namen en gegevenstypen van de geretourneerde resultatenset te wijzigen.

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. EXECUTE gebruiken om twee resultatensets opnieuw te definiëren

van toepassing op: SQL Server 2012 (11.x) en latere versies en Azure SQL Database.

Wanneer u een instructie uitvoert die meer dan één resultatenset retourneert, definieert u elke verwachte resultatenset. In het volgende voorbeeld in AdventureWorks2022 wordt een procedure gemaakt waarmee twee resultatensets worden geretourneerd. Vervolgens wordt de procedure uitgevoerd met behulp van de WITH RESULT SETS-component en worden twee definities van resultatensets opgegeven.

--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. EXECUTE gebruiken met AT DATA_SOURCE data_source_name om een query uit te voeren op een externe SQL Server

van toepassing op: SQL Server 2019 (15.x) en latere versies.

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe gegevensbron die verwijst naar een SQL Server-exemplaar.

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

P. EXECUTE gebruiken met AT DATA_SOURCE data_source_name om een query uit te voeren op de rekengroep in SQL Server Big Data Cluster

van toepassing op: SQL Server 2019 (15.x).

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe gegevensbron die verwijst naar een rekengroep in sql Server Big Data Cluster. In het voorbeeld wordt een gegevensbron gemaakt SqlComputePool op basis van een rekengroep in sql Server Big Data Cluster en wordt een SELECT-instructie uitgevoerd voor de gegevensbron.

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

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

Q. EXECUTE gebruiken met AT DATA_SOURCE data_source_name om een query uit te voeren op een gegevensgroep in SQL Server Big Data Cluster

van toepassing op: SQL Server 2019 (15.x).

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe gegevensbron die verwijst naar een rekengroep in BDC (Big Data Cluster). In het voorbeeld wordt een gegevensbron gemaakt SqlDataPool op basis van een gegevensgroep in BDC en wordt een SELECT-instructie uitgevoerd voor de gegevensbron.

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

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

R. EXECUTE gebruiken met AT DATA_SOURCE data_source_name om een query uit te voeren op een opslaggroep in SQL Server Big Data Cluster

van toepassing op: SQL Server 2019 (15.x).

In het volgende voorbeeld wordt een opdrachtreeks doorgegeven aan een externe gegevensbron die verwijst naar de rekengroep in het SQL Server Big Data-cluster. In het voorbeeld wordt een gegevensbron gemaakt SqlStoragePool op basis van een gegevensgroep in sql Server Big Data Cluster en wordt een SELECT-instructie uitgevoerd voor de gegevensbron.

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

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

Voorbeelden: Azure Synapse Analytics

De Transact-SQL codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

A: Basisprocedure uitvoeren

Voer een opgeslagen procedure uit:

EXECUTE proc1;

Roep een opgeslagen procedure aan met de naam die tijdens runtime is bepaald:

EXECUTE ('EXECUTE ' + @var);

Een opgeslagen procedure aanroepen vanuit een opgeslagen procedure:

CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;

B: Tekenreeksen uitvoeren

Voer een SQL-tekenreeks uit:

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

Voer een geneste tekenreeks uit:

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

Voer een tekenreeksvariabele uit:

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

EXECUTE (@stringVar);

C: Procedures met parameters

In het volgende voorbeeld wordt een procedure met parameters gemaakt en ziet u drie manieren om de procedure uit te voeren:

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

Uitvoeren met behulp van positionele parameters:

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

Voer deze opdracht uit met behulp van benoemde parameters in de volgende volgorde:

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

Uitvoeren met benoemde parameters buiten de volgorde:

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