Udostępnij za pośrednictwem


EXECUTE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft FabricSQL Database w usłudze Microsoft Fabric

Wykonuje ciąg polecenia lub ciąg znaków w ramach Transact-SQL partii lub jeden z następujących modułów: procedura składowana systemu, procedura składowana zdefiniowana przez użytkownika, procedura składowana CLR, funkcja zdefiniowana przez użytkownika skalarna lub rozszerzona procedura składowana. Instrukcję EXEC lub EXECUTE można użyć do wysyłania poleceń przekazywania do serwerów połączonych. Ponadto kontekst, w którym jest wykonywany ciąg lub polecenie, można jawnie ustawić. Metadane zestawu wyników można zdefiniować przy użyciu opcji WITH RESULT SETS.

Ważny

Przed wywołaniem EXECUTE ciągiem znaków zweryfikuj ciąg znaków. Nigdy nie wykonaj polecenia skonstruowanego na podstawie danych wejściowych użytkownika, które nie zostały zweryfikowane.

Transact-SQL konwencje składni

Składnia

Poniższy blok kodu przedstawia składnię w programie SQL Server 2019 (15.x) i nowszych wersjach. Alternatywnie zobacz składnię w programie SQL Server 2017 i starszych zamiast tego.

Składnia dla programu SQL Server 2019 i nowszych wersji.

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

Poniższy blok kodu przedstawia składnię w programie SQL Server 2017 (14.x) i starszych wersjach. Zamiast tego zobacz składnię w programie SQL Server 2019.

Składnia dla programu SQL Server 2017 i starszych wersji.

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

Składnia 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 ] ) }
}

Składnia usługi 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
}

Składnia dla usług Azure Synapse Analytics i 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 ] )
[ ; ]

Składnia dla usługi 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

Opcjonalna zmienna całkowita, która przechowuje stan powrotu modułu. Ta zmienna musi być zadeklarowana w partii, procedurze składowanej lub funkcji, zanim zostanie użyta w instrukcji EXECUTE.

Jeśli jest używana do wywoływania funkcji zdefiniowanej przez użytkownika o wartości skalarnej, zmienna @return_status może być dowolnego typu danych skalarnych.

module_name

W pełni kwalifikowana lub nieuprzykwalifikowana nazwa procedury składowanej lub funkcji zdefiniowanej przez użytkownika o wartości skalarnej do wywołania. Nazwy modułów muszą być zgodne z regułami dotyczącymi identyfikatorów . Nazwy rozszerzonych procedur składowanych są zawsze uwzględniane w wielkości liter, niezależnie od sortowania serwera.

Moduł utworzony w innej bazie danych można wykonać, jeśli użytkownik z uruchomionym modułem jest właścicielem modułu lub ma odpowiednie uprawnienia do jego wykonania w tej bazie danych. Moduł można wykonać na innym serwerze z uruchomionym programem SQL Server, jeśli użytkownik z uruchomionym modułem ma odpowiednie uprawnienia do korzystania z tego serwera (dostępu zdalnego) i do wykonania modułu w tej bazie danych. Jeśli określono nazwę serwera, ale nie określono żadnej nazwy bazy danych, aparat bazy danych programu SQL Server szuka modułu w domyślnej bazie danych użytkownika.

; numer

Opcjonalna liczba całkowita używana do grupowania procedur o tej samej nazwie. Ten parametr nie jest używany w przypadku rozszerzonych procedur składowanych.

Nuta

Ta funkcja zostanie usunięta w przyszłej wersji programu SQL Server. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.

Aby uzyskać więcej informacji na temat grup procedur, zobacz CREATE PROCEDURE.

@module_name_var

Nazwa lokalnie zdefiniowanej zmiennej reprezentującej nazwę modułu.

Może to być zmienna, która przechowuje nazwę natywnie skompilowanej, skalarnej funkcji zdefiniowanej przez użytkownika.

@parameter

Parametr dla module_name, zgodnie z definicją w module. Nazwy parametrów muszą być poprzedzone znakiem at (@). W przypadku użycia z wartością @parameter_name = formularza nazwy parametrów i stałe nie muszą być podane w kolejności, w której są zdefiniowane w module. Jeśli jednak wartość @parameter_name = formularza jest używana dla dowolnego parametru, musi być używana dla wszystkich kolejnych parametrów.

Domyślnie parametry są dopuszczane do wartości null.

wartości

Wartość parametru do przekazania do modułu lub polecenia przekazywanego. Jeśli nazwy parametrów nie są określone, wartości parametrów muszą być podane w kolejności zdefiniowanej w module.

Podczas wykonywania poleceń przekazywania względem serwerów połączonych kolejność wartości parametrów zależy od dostawcy OLE DB połączonego serwera. Większość dostawców OLE DB wiąże wartości z parametrami od lewej do prawej.

Jeśli wartość parametru to nazwa obiektu, ciąg znaków lub kwalifikowana przez nazwę bazy danych lub nazwę schematu, cała nazwa musi być ujęta w pojedyncze cudzysłowy. Jeśli wartość parametru jest słowem kluczowym, słowo kluczowe musi być ujęte w znaki podwójnego cudzysłowu.

Jeśli przekażesz pojedyncze słowo, które nie zaczyna się od @, który nie jest ujęty w cudzysłów (na przykład jeśli zapomnisz @ nazwy parametru), słowo jest traktowane jako ciąg nvarchar, pomimo brakujących cudzysłowów.

Jeśli w module zdefiniowano wartość domyślną, użytkownik może wykonać moduł bez określania parametru.

Wartość domyślna może być również NULL. Ogólnie rzecz biorąc, definicja modułu określa akcję, którą należy podjąć, jeśli wartość parametru jest NULL.

@variable

Zmienna, która przechowuje parametr lub parametr zwracany.

WYJŚCIE

Określa, że moduł lub ciąg polecenia zwraca parametr. Pasujący parametr w module lub ciągu polecenia musi również zostać utworzony przy użyciu słowa kluczowego OUTPUT. Użyj tego słowa kluczowego, gdy używasz zmiennych kursora jako parametrów.

Jeśli wartość jest zdefiniowana jako OUTPUT modułu wykonywanego na serwerze połączonym, wszelkie zmiany odpowiadające @parameter wykonywane przez dostawcę OLE DB są kopiowane z powrotem do zmiennej na końcu wykonywania modułu.

Jeśli są używane parametry OUTPUT i intencją jest użycie wartości zwracanych w innych instrukcjach w wywoływanej partii lub module, wartość parametru musi zostać przekazana jako zmienna, taka jak @parameter = @variable. Nie można wykonać modułu, określając OUTPUT dla parametru, który nie jest zdefiniowany jako parametr OUTPUT w module. Nie można przekazać stałych do modułu przy użyciu OUTPUT; parametr zwracany wymaga nazwy zmiennej. Typ danych zmiennej musi być zadeklarowany i przypisana wartość przed wykonaniem procedury.

Jeśli EXECUTE jest używana względem zdalnej procedury składowanej lub do wykonywania polecenia przekazywania na serwerze połączonym, OUTPUT parametrów nie może być żadnym z dużych typów danych obiektu (LOB).

Parametry zwracane mogą być dowolnego typu danych, z wyjątkiem typów danych BIZNESOWYCH.

DOMYŚLNY

Dostarcza wartość domyślną parametru zgodnie z definicją w module. Gdy moduł oczekuje wartości parametru, który nie ma zdefiniowanej wartości domyślnej i brakuje parametru lub zostanie określony DEFAULT słowo kluczowe, wystąpi błąd.

@string_variable

Nazwa zmiennej lokalnej. @string_variable może być dowolnym char, varchar, ncharlub nvarchar typu danych. Należą do nich (maksymalna) typów danych.

[N]'tsql_string'

Ciąg stały. tsql_string może być dowolnym typem danych nvarchar lub varchar. Jeśli N jest dołączony, ciąg jest interpretowany jako nvarchar typ danych.

AS context_specification

Określa kontekst, w którym jest wykonywana instrukcja.

LOGIN

Określa kontekst, który ma być personifikowany, jest identyfikatorem logowania. Zakres personifikacji to serwer.

UŻYTKOWNIK

Określa kontekst, który ma być personifikowany, jest użytkownikiem w bieżącej bazie danych. Zakres personifikacji jest ograniczony do bieżącej bazy danych. Przełączenie kontekstu do użytkownika bazy danych nie dziedziczy uprawnień na poziomie serwera tego użytkownika.

Ważny

Gdy przełączenie kontekstu do użytkownika bazy danych jest aktywne, każda próba uzyskania dostępu do zasobów spoza bazy danych powoduje niepowodzenie instrukcji. Obejmuje to instrukcje USE <database>, zapytania rozproszone i zapytania odwołujące się do innej bazy danych przy użyciu identyfikatorów trzyczęściowych lub czteroczęściowych.

'nazwa'

Prawidłowa nazwa użytkownika lub logowania. Argument nazwy musi być elementem członkowskim sysadmin stałej roli serwera lub istnieje jako podmiot zabezpieczeń odpowiednio w sys.database_principals lub sys.server_principals.

Ten argument nie może być wbudowanym kontem, takim jak NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicelub NT AUTHORITY\LocalSystem.

Aby uzyskać więcej informacji, zobacz Określanie nazwy użytkownika lub nazwy logowania w dalszej części tego artykułu.

[N]'command_string'

Ciąg stały zawierający polecenie, które ma zostać przekazane do serwera połączonego. Jeśli N jest dołączony, ciąg jest interpretowany jako nvarchar typ danych.

[?]

Wskazuje parametry, dla których wartości są podane w <arg-list> poleceń przekazywania używanych w instrukcji EXECUTE ('...', <arg-list>) AT <linkedsrv>.

AT linked_server_name

Określa, że command_string jest wykonywany względem linked_server_name i wyniki, jeśli istnieją, są zwracane do klienta. linked_server_name musi odwoływać się do istniejącej definicji serwera połączonego na serwerze lokalnym. Połączone serwery są definiowane przy użyciu sp_addlinkedserver.

  • WITH <execute_option>

    Możliwe opcje wykonywania. Nie można określić opcji RESULT SETS w instrukcji INSERT...EXECUTE.

AT DATA_SOURCE data_source_name

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje.

Określa, że command_string jest wykonywany względem data_source_name i wyniki, jeśli istnieją, są zwracane do klienta. data_source_name musi odwoływać się do istniejącej definicji EXTERNAL DATA SOURCE w bazie danych. Obsługiwane są tylko źródła danych wskazujące program SQL Server. Ponadto w przypadku źródeł danych klastra danych big data programu SQL Server, które wskazują pulę obliczeniową, pulę danych lub pulę magazynów są obsługiwane. Źródła danych są definiowane przy użyciu CREATE EXTERNAL DATA SOURCE.

  • WITH <execute_option>

    Możliwe opcje wykonywania. Nie można określić opcji RESULT SETS w instrukcji INSERT...EXECUTE.

    Termin Definicja
    RECOMPILE Wymusza skompilowanie, zastosowanie i odrzucenie nowego planu po wykonaniu modułu. Jeśli istnieje plan zapytania dla modułu, ten plan pozostanie w pamięci podręcznej.

    Użyj tej opcji, jeśli parametr, który podajesz, jest nietypowy lub jeśli dane uległy znacznej zmianie. Ta opcja nie jest używana w przypadku rozszerzonych procedur składowanych. Zalecamy używanie tej opcji oszczędnie, ponieważ jest to kosztowne.

    Uwaga: Nie można użyć WITH RECOMPILE podczas wywoływania procedury składowanej korzystającej ze składni OPENDATASOURCE. Opcja WITH RECOMPILE jest ignorowana po określeniu nazwy obiektu czteroczęściowego.

    Uwaga:RECOMPILE nie jest obsługiwana z natywnie skompilowanymi, skalarnymi funkcjami zdefiniowanymi przez użytkownika. Jeśli musisz ponownie skompilować plik, użyj sp_recompile.
    RESULT SETS UNDEFINED Ta opcja nie gwarantuje, jakie wyniki, jeśli istnieją, są zwracane i nie podano żadnej definicji. Instrukcja jest wykonywana bez błędu, jeśli zostaną zwrócone żadne wyniki lub nie zostaną zwrócone żadne wyniki. RESULT SETS UNDEFINED jest zachowaniem domyślnym, jeśli nie podano result_sets_option.

    W przypadku interpretowanych funkcji zdefiniowanych przez użytkownika skalarnych i natywnie skompilowanych funkcji zdefiniowanych przez użytkownika skalarnych ta opcja nie działa, ponieważ funkcje nigdy nie zwracają zestawu wyników.

    Dotyczy: SQL Server 2012 (11.x) i nowsze wersje oraz Azure SQL Database.
    RESULT SETS NONE Gwarantuje, że instrukcja EXECUTE nie zwraca żadnych wyników. Jeśli zostaną zwrócone jakiekolwiek wyniki, partia zostanie przerwana.

    W przypadku interpretowanych funkcji zdefiniowanych przez użytkownika skalarnych i natywnie skompilowanych funkcji zdefiniowanych przez użytkownika skalarnych ta opcja nie działa, ponieważ funkcje nigdy nie zwracają zestawu wyników.

    Dotyczy: SQL Server 2012 (11.x) i nowsze wersje oraz Azure SQL Database.
    <result_sets_definition> Zapewnia gwarancję, że wynik zostanie przywrócony zgodnie z result_sets_definition. W przypadku instrukcji, które zwracają wiele zestawów wyników, podaj wiele result_sets_definition sekcji. Ujęć każdy result_sets_definition w nawiasy, oddzielone przecinkami. Aby uzyskać więcej informacji, zobacz <result_sets_definition> w dalszej części tego artykułu.

    Ta opcja zawsze powoduje błąd dla natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika, ponieważ funkcje nigdy nie zwracają zestawu wyników.

    Dotyczy: SQL Server 2012 (11.x) i nowsze wersje oraz Azure SQL Database.

    <result_sets_definition> opisuje zestawy wyników zwracane przez wykonane instrukcje. Klauzule result_sets_definition mają następujące znaczenie:

    Termin Definicja
    { column_name data_type
    [ COLLATE collation_name ]
    [NULL | NOT NULL] }
    Zobacz poniższą tabelę.
    db_name Nazwa bazy danych zawierającej funkcję tabeli, widoku lub tabeli.
    schema_name Nazwa schematu będącego właścicielem funkcji tabeli, widoku lub tabeli.
    table_name | view_name | table_valued_function_name Określa, że zwracane kolumny są określone w funkcji tabeli, widoku lub tabeli o nazwie. Zmienne tabeli, tabele tymczasowe i synonimy nie są obsługiwane w składni obiektu AS.
    JAKO TYP [ schema_name. ]table_type_name Określa, że zwracane kolumny są określone w typie tabeli.
    AS FOR XML Określa, że wyniki XML z instrukcji lub procedury składowanej wywoływanej przez instrukcję EXECUTE są konwertowane na format tak, jakby zostały wygenerowane przez instrukcję SELECT ... FOR XML .... Wszystkie formatowania z dyrektyw typów w oryginalnej instrukcji są usuwane, a zwracane wyniki są tak, jakby nie określono dyrektywy typu. AS FOR XML nie konwertuje wyników tabelarycznych innych niż XML z wykonanej instrukcji lub procedury składowanej na XML.
    Termin Definicja
    column_name Nazwy każdej kolumny. Jeśli liczba kolumn różni się od zestawu wyników, wystąpi błąd, a partia zostanie przerwana. Jeśli nazwa kolumny różni się od zestawu wyników, zwracana nazwa kolumny zostanie ustawiona na zdefiniowaną nazwę.
    data_type Typy danych każdej kolumny. Jeśli typy danych różnią się, wykonywana jest niejawna konwersja na zdefiniowany typ danych. Jeśli konwersja nie powiedzie się, partia zostanie przerwana
    SORTOWANIE collation_name Sortowanie każdej kolumny. Jeśli występuje niezgodność sortowania, zostanie podjęta próba niejawnego sortowania. Jeśli to się nie powiedzie, partia zostanie przerwana.
    NULL | NOT NULL Wartość null każdej kolumny. Jeśli zdefiniowana wartość null jest NOT NULL, a zwrócone dane zawierają wartości null, wystąpi błąd, a partia zostanie przerwana. Jeśli nie zostanie określona, wartość domyślna jest zgodna z ustawieniem opcji ANSI_NULL_DFLT_ON i ANSI_NULL_DFLT_OFF.

    Rzeczywisty zestaw wyników zwracany podczas wykonywania może różnić się od wyniku zdefiniowanego przy użyciu klauzuli WITH RESULT SETS w jeden z następujących sposobów: liczba zestawów wyników, liczba kolumn, nazwa kolumny, wartość null i typ danych. Jeśli liczba zestawów wyników jest różna, wystąpi błąd, a partia zostanie przerwana.

Uwagi

Parametry można podać przy użyciu wartości lub @parameter_namewartości. Parametr nie jest częścią transakcji; w związku z tym, jeśli parametr zostanie zmieniony w transakcji, która zostanie później wycofana, wartość parametru nie zostanie przywrócona do poprzedniej wartości. Wartość zwracana do elementu wywołującego jest zawsze wartością w momencie zwracania modułu.

Zagnieżdżanie występuje, gdy jeden moduł wywołuje inny lub wykonuje kod zarządzany, odwołując się do modułu środowiska uruchomieniowego języka wspólnego (CLR), typu zdefiniowanego przez użytkownika lub agregacji. Poziom zagnieżdżania zwiększa się, gdy wywoływany moduł lub odwołanie do kodu zarządzanego rozpoczyna wykonywanie, a po zakończeniu odwołań do wywoływanego modułu lub kodu zarządzanego następuje dekrementowanie. Przekroczenie maksymalnie 32 poziomów zagnieżdżania powoduje niepowodzenie całego łańcucha wywołań. Bieżący poziom zagnieżdżania jest przechowywany w funkcji systemu @@NESTLEVEL.

Ponieważ zdalne procedury składowane i rozszerzone procedury składowane nie należą do zakresu transakcji (chyba że wystawione w ramach instrukcji BEGIN DISTRIBUTED TRANSACTION lub w przypadku użycia z różnymi opcjami konfiguracji), polecenia wykonywane za pośrednictwem wywołań do nich nie mogą zostać wycofane. Aby uzyskać więcej informacji, zobacz System procedur składowanych i BEGIN DISTRIBUTED TRANSACTION.

Jeśli używasz zmiennych kursora, jeśli wykonujesz procedurę, która przechodzi w zmiennej kursora z przydzielonym kursorem, wystąpi błąd.

Nie musisz określać słowa kluczowego EXECUTE podczas wykonywania modułów, jeśli instrukcja jest pierwszą w partii.

Aby uzyskać więcej informacji specyficznych dla procedur składowanych CLR, zobacz CLR Stored Procedures.

Używanie funkcji EXECUTE z procedurami składowanymi

Nie musisz określać słowa kluczowego EXECUTE podczas wykonywania procedur składowanych, gdy instrukcja jest pierwszą w partii.

Procedury składowane systemu SQL Server zaczynają się od znaków sp_. Są one fizycznie przechowywane w bazie danych zasobów , ale logicznie są wyświetlane w schemacie systemu i bazy danych zdefiniowanej przez użytkownika. Podczas wykonywania systemowej procedury składowanej w partii lub wewnątrz modułu, takiego jak procedura składowana lub funkcja zdefiniowana przez użytkownika, zalecamy zakwalifikowanie nazwy procedury składowanej z nazwą schematu systemu.

Rozszerzone procedury składowane systemu SQL Server zaczynają się od znaków xp_, a są one zawarte w schemacie dbo bazy danych master. Podczas wykonywania rozszerzonej procedury składowanej systemu w partii lub wewnątrz modułu, takiego jak procedura składowana lub funkcja zdefiniowana przez użytkownika, zalecamy zakwalifikowanie nazwy procedury składowanej master.dbo.

Podczas wykonywania procedury składowanej zdefiniowanej przez użytkownika w partii lub wewnątrz modułu, takiego jak procedura składowana zdefiniowana przez użytkownika lub funkcja, zalecamy zakwalifikowanie nazwy procedury składowanej z nazwą schematu. Nie zalecamy nazywania procedury składowanej zdefiniowanej przez użytkownika tą samą nazwą co procedura składowana systemu. Aby uzyskać więcej informacji na temat wykonywania procedur składowanych, zobacz Wykonywanie procedury składowanej.

Używanie funkcji EXECUTE z ciągiem znaków

W programie SQL Server można określić varchar(max) i nvarchar(max) typów danych, które umożliwiają używanie ciągów znaków do 2 gigabajtów danych.

Zmiany w kontekście bazy danych trwają tylko do końca instrukcji EXECUTE. Na przykład po uruchomieniu EXECUTE w poniższej instrukcji kontekst bazy danych jest master.

USE master;

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

Przełączanie kontekstu

Możesz użyć klauzuli AS { LOGIN | USER } = '<name>', aby przełączyć kontekst wykonywania instrukcji dynamicznej. Po określeniu przełącznika kontekstu jako EXECUTE ('string') AS <context_specification>czas trwania przełącznika kontekstu jest ograniczony do zakresu wykonywanego zapytania.

Określanie nazwy użytkownika lub logowania

Nazwa użytkownika lub logowania określona w AS { LOGIN | USER } = '<name>' musi istnieć odpowiednio jako podmiot zabezpieczeń w sys.database_principals lub sys.server_principals lub instrukcja kończy się niepowodzeniem. Ponadto uprawnienia IMPERSONATE muszą zostać przyznane podmiotowi zabezpieczeń. Jeśli obiekt wywołujący nie jest właścicielem bazy danych lub jest członkiem sysadmin stałej roli serwera, podmiot zabezpieczeń musi istnieć nawet wtedy, gdy użytkownik uzyskuje dostęp do bazy danych lub wystąpienia programu SQL Server za pośrednictwem członkostwa w grupie systemu Windows. Załóżmy na przykład następujące warunki:

  • CompanyDomain\SQLUsers grupa ma dostęp do bazy danych Sales.

  • CompanyDomain\SqlUser1 jest członkiem SQLUsers i dlatego ma niejawny dostęp do bazy danych Sales.

Mimo że CompanyDomain\SqlUser1 ma dostęp do bazy danych za pośrednictwem członkostwa w grupie SQLUsers, instrukcja EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' kończy się niepowodzeniem, ponieważ CompanyDomain\SqlUser1 nie istnieje jako podmiot zabezpieczeń w bazie danych.

Najlepsze rozwiązania

Określ identyfikator logowania lub użytkownika, który ma najmniejsze uprawnienia wymagane do wykonywania operacji zdefiniowanych w instrukcji lub module. Na przykład nie należy określać nazwy logowania, która ma uprawnienia na poziomie serwera, jeśli wymagane są tylko uprawnienia na poziomie bazy danych. Lub nie określaj konta właściciela bazy danych, chyba że te uprawnienia są wymagane.

Uprawnienia

Uprawnienia nie są wymagane do uruchomienia instrukcji EXECUTE. Jednak uprawnienia są wymagane w zabezpieczanych elementach, do których odwołuje się ciąg EXECUTE. Jeśli na przykład ciąg zawiera instrukcję INSERT, obiekt wywołujący instrukcji EXECUTE musi mieć uprawnienia INSERT w tabeli docelowej. Uprawnienia są sprawdzane w momencie napotkania instrukcji EXECUTE, nawet jeśli instrukcja EXECUTE jest uwzględniona w module.

EXECUTE uprawnienia dla modułu domyślnego dla właściciela modułu, który może przenieść je do innych użytkowników. Po uruchomieniu modułu, który wykonuje ciąg, uprawnienia są sprawdzane w kontekście użytkownika, który wykonuje moduł, a nie w kontekście użytkownika, który utworzył moduł. Jeśli jednak ten sam użytkownik jest właścicielem modułu wywołującego i wywoływanego modułu, EXECUTE sprawdzanie uprawnień nie jest wykonywane dla drugiego modułu.

Jeśli moduł uzyskuje dostęp do innych obiektów bazy danych, wykonanie zakończy się pomyślnie, gdy masz EXECUTE uprawnienia do modułu, a jeden z następujących warunków jest spełniony:

  • Moduł jest oznaczony EXECUTE AS USER lub EXECUTE AS SELF, a właściciel modułu ma odpowiednie uprawnienia do obiektu, do których odwołuje się odwołanie. Aby uzyskać więcej informacji na temat personifikacji w module, zobacz EXECUTE AS klauzula.

  • Moduł jest oznaczony EXECUTE AS CALLERi masz odpowiednie uprawnienia do obiektu.

  • Moduł jest oznaczony jako EXECUTE AS <user_name>, a <user_name> ma odpowiednie uprawnienia do obiektu.

Uprawnienia przełączania kontekstu

Aby określić EXECUTE AS podczas logowania, obiekt wywołujący musi mieć IMPERSONATE uprawnienia do określonej nazwy logowania. Aby określić EXECUTE AS użytkownika bazy danych, obiekt wywołujący musi mieć IMPERSONATE uprawnienia do określonej nazwy użytkownika. Jeśli nie określono kontekstu wykonywania lub określono EXECUTE AS CALLER, IMPERSONATE uprawnienia nie są wymagane.

Przykłady: SQL Server

Przykłady kodu Transact-SQL w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykłady programu Microsoft SQL Server i projekty społeczności.

A. Przekazywanie pojedynczego parametru za pomocą polecenia EXECUTE

Procedura składowana uspGetEmployeeManagers w bazie danych AdventureWorks2022 oczekuje jednego parametru (@EmployeeID). Poniższe przykłady wykonują procedurę składowaną uspGetEmployeeManagers z Employee ID 6 jako jego wartości parametru.

EXECUTE dbo.uspGetEmployeeManagers 6;
GO

Zmienna może być jawnie nazwana w wykonaniu:

EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Jeśli poniższa instrukcja jest pierwszą instrukcją w partii lub skryptem sqlcmd, EXECUTE nie jest wymagana.

dbo.uspGetEmployeeManagers 6;
GO

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

B. Używanie wielu parametrów

Poniższy przykład wykonuje procedurę składowaną spGetWhereUsedProductID w bazie danych AdventureWorks2022. Przekazuje dwa parametry: pierwszy parametr jest identyfikatorem produktu (819), a drugi parametr @CheckDate jest wartością data/godzina.

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

EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

C. Używanie polecenia EXECUTE "tsql_string" ze zmienną

W poniższym przykładzie pokazano, jak EXECUTE obsługuje dynamicznie tworzone ciągi zawierające zmienne. Ten przykład tworzy kursor tables_cursor do przechowywania listy wszystkich tabel zdefiniowanych przez użytkownika w bazie danych AdventureWorks2022, a następnie używa tej listy do ponownego kompilowania wszystkich indeksów w tabelach.

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. Używanie funkcji EXECUTE z zdalną procedurą składowaną

Poniższy przykład wykonuje procedurę składowaną uspGetEmployeeManagers na serwerze zdalnym SQLSERVER1 i przechowuje stan powrotu wskazujący powodzenie lub niepowodzenie w @retstat.

DECLARE @retstat AS INT;

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

E. Używanie funkcji EXECUTE ze zmienną procedury składowanej

Poniższy przykład tworzy zmienną reprezentującą nazwę procedury składowanej.

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

EXECUTE @proc_name;

F. Używanie funkcji EXECUTE z ustawieniem DEFAULT

Poniższy przykład tworzy procedurę składowaną z wartościami domyślnymi dla pierwszych i trzecich parametrów. Po uruchomieniu procedury te wartości domyślne są wstawiane dla pierwszych i trzecich parametrów, gdy w wywołaniu nie zostanie przekazana żadna wartość lub gdy zostanie określona wartość domyślna. Zwróć uwagę na różne sposoby użycia słowa kluczowego 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

Procedura składowana Proc_Test_Defaults może być wykonywana w wielu kombinacjach.

-- 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. Używanie funkcji EXECUTE z usługą AT linked_server_name

Poniższy przykład przekazuje ciąg polecenia do serwera zdalnego. Tworzy serwer połączony SeattleSales, który wskazuje inne wystąpienie programu SQL Server i wykonuje instrukcję DDL (CREATE TABLE) na tym połączonym serwerze.

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

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

H. Używanie POLECENIA EXECUTE Z POLECENIEM RECOMPILE

Poniższy przykład wykonuje procedurę składowaną Proc_Test_Defaults i wymusza skompilowanie, zastosowanie i odrzucenie nowego planu zapytania po wykonaniu modułu.

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

Ja. Używanie funkcji EXECUTE z funkcją zdefiniowaną przez użytkownika

Poniższy przykład wykonuje funkcję zdefiniowaną przez użytkownika ufnGetSalesOrderStatusText skalarną w bazie danych AdventureWorks2022. Używa @returnstatus zmiennej do przechowywania wartości zwracanej przez funkcję. Funkcja oczekuje jednego parametru wejściowego, @Status. Jest to definiowane jako tinyint typu danych.

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

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

PRINT @returnstatus;
GO

J. Wykonywanie zapytań względem bazy danych Oracle na połączonym serwerze

Poniższy przykład wykonuje kilka instrukcji SELECT na zdalnym serwerze Oracle. Przykład rozpoczyna się od dodania serwera Oracle jako serwera połączonego i utworzenia połączonego logowania do serwera.

-- 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. Użyj polecenia EXECUTE AS USER, aby przełączyć kontekst na innego użytkownika

Poniższy przykład wykonuje ciąg Transact-SQL, który tworzy tabelę i określa klauzulę AS USER, aby przełączyć kontekst wykonywania instrukcji z obiektu wywołującego na User1. Aparat bazy danych sprawdza uprawnienia User1 po uruchomieniu instrukcji. User1 musi istnieć jako użytkownik w bazie danych i musi mieć uprawnienia do tworzenia tabel w schemacie Sales lub instrukcja kończy się niepowodzeniem.

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

L. Używanie parametru z funkcją EXECUTE i AT linked_server_name

Poniższy przykład przekazuje ciąg polecenia do serwera zdalnego przy użyciu znaku zapytania (?) symbol zastępczy parametru. W tym przykładzie tworzony jest połączony serwer SeattleSales, który wskazuje inne wystąpienie programu SQL Server i wykonuje instrukcję SELECT względem tego serwera połączonego. Instrukcja SELECT używa znaku zapytania jako posiadacza zastępczego dla parametru ProductID (952), który jest podany po instrukcji .

-- 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. Użyj polecenia EXECUTE, aby ponownie zdefiniować pojedynczy zestaw wyników

Dotyczy: SQL Server 2012 (11.x) i nowsze wersje oraz Azure SQL Database.

Niektóre z poprzednich przykładów zostały wykonane EXECUTE dbo.uspGetEmployeeManagers 6;, które zwróciły siedem kolumn. W poniższym przykładzie pokazano użycie składni WITH RESULT SET w celu zmiany nazw i typów danych zwracanego zestawu wyników.

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. Użyj polecenia EXECUTE, aby ponownie zdefiniować dwa zestawy wyników

Dotyczy: SQL Server 2012 (11.x) i nowsze wersje oraz Azure SQL Database.

Podczas wykonywania instrukcji zwracającej więcej niż jeden zestaw wyników zdefiniuj każdy oczekiwany zestaw wyników. Poniższy przykład w AdventureWorks2022 tworzy procedurę zwracającą dwa zestawy wyników. Następnie procedura jest wykonywana przy użyciu klauzuli WITH RESULT SETS i określania dwóch definicji zestawu wyników.

--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. Używanie funkcji EXECUTE z DATA_SOURCE data_source_name AT do wykonywania zapytań dotyczących zdalnego programu SQL Server

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje.

Poniższy przykład przekazuje ciąg polecenia do zewnętrznego źródła danych wskazującego wystąpienie programu SQL Server.

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

P. Używanie funkcji EXECUTE z usługą AT DATA_SOURCE data_source_name do wykonywania zapytań dotyczących puli obliczeniowej w klastrze danych big data programu SQL Server

Dotyczy: SQL Server 2019 (15.x).

Poniższy przykład przekazuje ciąg polecenia do zewnętrznego źródła danych wskazującego pulę obliczeniową w klastrze danych big data programu SQL Server. Przykład tworzy źródło danych SqlComputePool względem puli obliczeniowej w klastrze danych big data programu SQL Server i wykonuje instrukcję SELECT względem źródła danych.

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

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

Q. Używanie funkcji EXECUTE z usługą AT DATA_SOURCE data_source_name do wykonywania zapytań dotyczących puli danych w klastrze danych big data programu SQL Server

Dotyczy: SQL Server 2019 (15.x).

Poniższy przykład przekazuje ciąg polecenia do zewnętrznego źródła danych wskazującego pulę obliczeniową w klastrze danych big data programu SQL Server (BDC). W przykładzie utworzono źródło danych SqlDataPool względem puli danych w usłudze BDC i wykona instrukcję SELECT względem źródła danych.

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

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

R. Używanie funkcji EXECUTE z usługą AT DATA_SOURCE data_source_name do wykonywania zapytań dotyczących puli magazynów w klastrze danych big data programu SQL Server

Dotyczy: SQL Server 2019 (15.x).

Poniższy przykład przekazuje ciąg polecenia do zewnętrznego źródła danych wskazującego pulę obliczeniową w klastrze danych big data programu SQL Server. Przykład tworzy źródło danych SqlStoragePool względem puli danych w klastrze danych big data programu SQL Server i wykonuje instrukcję SELECT względem źródła danych.

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

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

Przykłady: Azure Synapse Analytics

Przykłady kodu Transact-SQL w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykłady programu Microsoft SQL Server i projekty społeczności.

1: Podstawowe wykonywanie procedury

Wykonaj procedurę składowaną:

EXECUTE proc1;

Wywołaj procedurę składowaną o nazwie określonej w czasie wykonywania:

EXECUTE ('EXECUTE ' + @var);

Wywołaj procedurę składowaną z poziomu procedury składowanej:

CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;

B: Wykonywanie ciągów

Wykonaj ciąg SQL:

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

Wykonaj zagnieżdżony ciąg:

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

Wykonaj zmienną ciągu:

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

EXECUTE (@stringVar);

C: Procedury z parametrami

W poniższym przykładzie utworzono procedurę z parametrami i przedstawiono trzy sposoby wykonywania 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

Wykonaj przy użyciu parametrów pozycyjnych:

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

Wykonaj polecenie przy użyciu nazwanych parametrów w kolejności:

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

Wykonaj polecenie przy użyciu nazwanych parametrów poza kolejnością:

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