Sdílet prostřednictvím


CREATE PROCEDURE (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vytváří uloženTransact-SQL ou proceduru pro běžné běhání (CLR) v rámci běžného jazyka (CLR) v SQL Serveru, Azure SQL databázi, SQL databázi v Microsoft Fabric a Analytics Platform System (PDW). Uložené procedury jsou podobné procedurě v jiných programovacích jazycích, které mohou:

  • Přijměte vstupní parametry a vraťte více hodnot ve formě výstupních parametrů do volající procedury nebo dávky.
  • Obsahují programovací příkazy, které provádějí operace v databázi, včetně volání dalších procedur.
  • Vrátí hodnotu stavu do volající procedury nebo dávky, která označuje úspěch nebo selhání (a důvod selhání).

Tento příkaz použijte k vytvoření trvalé procedury v aktuální databázi nebo dočasné procedury v tempdb databázi.

Poznámka:

Integrace modulu CLR rozhraní .NET Framework do SQL Serveru je popsána v tomto tématu. Integrace CLR se nevztahuje na Azure SQL Database ani SQL databáze v Microsoft Fabric.

Přejděte na jednoduché příklady , abyste přeskočí podrobnosti o syntaxi a dostali se k rychlému příkladu základní uložené procedury.

Transact-SQL konvence syntaxe

Syntaxe

Transact-SQL syntax pro uložené procedury v SQL Serveru, Azure SQL Database, SQL databázi v Microsoft Fabric:

CREATE [ OR ALTER ] { PROC | PROCEDURE }
    [schema_name.] procedure_name [ ; number ]
    [ { @parameter_name [ type_schema_name. ] data_type }
        [ VARYING ] [ NULL ] [ = default ] [ OUT | OUTPUT | [READONLY]
    ] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]

<procedure_option> ::=
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE AS Clause ]

Transact-SQL syntaxe uložených procedur CLR:

CREATE [ OR ALTER ] { PROC | PROCEDURE }
    [schema_name.] procedure_name [ ; number ]
    [ { @parameter_name [ type_schema_name. ] data_type }
        [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ]
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Transact-SQL syntaxe pro nativně zkompilované uložené procedury:

CREATE [ OR ALTER ] { PROC | PROCEDURE } [schema_name.] procedure_name
    [ { @parameter data_type } [ NULL | NOT NULL ] [ = default ]
        [ OUT | OUTPUT ] [READONLY]
    ] [ ,... n ]
  WITH NATIVE_COMPILATION, SCHEMABINDING [ , EXECUTE AS clause ]
AS
{
  BEGIN ATOMIC WITH ( <set_option> [ ,... n ] )
sql_statement [;] [ ... n ]
[ END ]
}
[;]

<set_option> ::=
    LANGUAGE = [ N ] 'language'
  | TRANSACTION ISOLATION LEVEL = { SNAPSHOT | REPEATABLE READ | SERIALIZABLE }
  | [ DATEFIRST = number ]
  | [ DATEFORMAT = format ]
  | [ DELAYED_DURABILITY = { OFF | ON } ]

Transact-SQL syntaxe uložených procedur ve službě Azure Synapse Analytics a paralelním datovém skladu:

CREATE { PROC | PROCEDURE } [ schema_name.] procedure_name
    [ { @parameter data_type } [ OUT | OUTPUT ] ] [ ,...n ]
AS
{
  [ BEGIN ] sql_statement [;][ ,...n ] [ END ]
}
[;]

Transact-SQL syntaxe uložených procedur v Microsoft Fabric:

CREATE [ OR ALTER ] { PROC | PROCEDURE } [ schema_name.] procedure_name
    [ { @parameter data_type } [ OUT | OUTPUT ] ] [ ,...n ]
AS
{
  [ BEGIN ] sql_statement [;][ ,...n ] [ END ]
}
[;]

Arguments

NEBO ALTER

Platí na: Azure SQL Database, SQL databázi v Microsoft Fabric, SQL Server (počínaje SQL Server 2016 (13.x) SP1).

Změní proceduru, pokud již existuje.

schema_name

Název schématu, do kterého procedura patří. Procedury jsou vázané na schéma. Pokud při vytváření procedury není zadán název schématu, přiřadí se automaticky výchozí schéma uživatele, který proceduru vytváří.

procedure_name

Název procedury. Názvy procedur musí být v souladu s pravidly pro identifikátory a musí být jedinečné v rámci schématu.

Upozornění

Vyhněte se použití předpony sp_ při pojmenování procedur. Sql Server tuto předponu používá k určení systémových procedur. Použití předpony může způsobit přerušení kódu aplikace, pokud existuje systémový postup se stejným názvem.

Místní nebo globální dočasné procedury lze vytvořit pomocí jednoho znaku čísla (#) před procedure_name (#procedure_name) pro místní dočasné procedury a dvěma znaky čísel pro globální dočasné procedury (##procedure_name). Místní dočasná procedura je viditelná pouze pro připojení, které ho vytvořilo, a při zavření tohoto připojení se ukončí. Globální dočasný postup je k dispozici pro všechna připojení a ukončí se na konci poslední relace pomocí postupu. Pro procedury CLR nelze zadat dočasné názvy.

Úplný název procedury nebo globální dočasné procedury, včetně ##, nesmí překročit 128 znaků. Úplný název místního dočasného postupu, včetně #znaků , nesmí překročit 116 znaků.

; číslo

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database, SQL databázi v Microsoft Fabric.

Volitelné celé číslo, které se používá k seskupení procedur stejného názvu. Tyto seskupené procedury lze seskupit pomocí jednoho příkazu DROP PROCEDURE.

Poznámka:

Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.

Číslované procedury nemůžou používat uživatelem definované typy XML nebo CLR a nelze je použít v průvodci plánem.

@ parameter_name

Parametr deklarovaný v postupu. Zadejte název parametru pomocí znaku at (@) jako prvního znaku. Název parametru musí splňovat pravidla pro identifikátory. Parametry jsou místní pro postup; stejné názvy parametrů lze použít v jiných postupech.

Jeden nebo více parametrů lze deklarovat; maximum je 2 100. Hodnota každého deklarovaného parametru musí být zadána uživatelem, pokud je volána procedura, pokud není definována výchozí hodnota parametru nebo hodnota je nastavena tak, aby byla rovna jinému parametru. Pokud procedura obsahuje parametry s hodnotou tabulky a parametr ve volání chybí, předá se prázdná tabulka. Parametry mohou probíhat pouze u konstantních výrazů; Nelze je použít místo názvů tabulek, názvů sloupců ani názvů jiných databázových objektů. Další informace naleznete v tématu EXECUTE (Transact-SQL).

Parametry nelze deklarovat, pokud je zadána funkce FOR REPLICATION.

[ type_schema_name. ] data_type

Datový typ parametru a schématu, do kterého patří datový typ.

Pokyny pro postupy Transact-SQL:

  • Všechny datové typy Transact-SQL lze použít jako parametry.
  • Pomocí uživatelem definovaného typu tabulky můžete vytvořit parametry s hodnotou tabulky. Parametry s hodnotou tabulky můžou být pouze vstupní parametry a musí být doprovázeny klíčovým slovem READONLY. Další informace najdete v tématu Použití parametrů Table-Valued (databázový stroj)
  • datové typy kurzoru mohou být pouze parametry VÝSTUP a musí být doprovázeny klíčovým slovem VARYING.

Pokyny pro postupy CLR:

  • Všechny nativní datové typy SQL Serveru, které mají ekvivalent ve spravovaném kódu, lze použít jako parametry. Další informace o korespondenci mezi typy CLR a systémovými datovými typy SQL Serveru naleznete v tématu Mapování dat parametrů CLR. Další informace o systémových datových typech SQL Serveru a jejich syntaxi naleznete v tématu Datové typy (Transact-SQL).

  • Datové typy s hodnotou tabulky nebo kurzoru nelze použít jako parametry.

  • Pokud je datový typ parametru uživatelem definovaným typem CLR, musíte mít oprávnění EXECUTE k typu.

PROMĚNNÝ

Určuje sadu výsledků podporovanou jako výstupní parametr. Tento parametr je dynamicky sestaven procedurou a jeho obsah se může lišit. Platí pouze pro parametry kurzoru . Tato možnost není platná pro procedury CLR.

default

Výchozí hodnota parametru. Pokud je pro parametr definována výchozí hodnota, lze proceduru provést bez zadání hodnoty pro tento parametr. Výchozí hodnota musí být konstanta nebo může mít hodnotu NULL. Konstantní hodnota může být ve formě zástupného znaku, což umožňuje použít klíčové slovo LIKE při předání parametru do procedury.

Výchozí hodnoty jsou ve sloupci zaznamenány sys.parameters.default pouze pro procedury CLR. Tento sloupec má hodnotu NULL pro parametry procedury Transact-SQL.

OUT | VÝSTUP

Označuje, že parametr je výstupní parametr. Pomocí parametrů OUTPUT vrátíte hodnoty volajícímu procedury. parametry textu, ntextu a obrázku nelze použít jako parametry VÝSTUP, pokud se nejedná o proceduru CLR. Výstupní parametr může být zástupný symbol kurzoru, pokud se nejedná o proceduru CLR. Datový typ table-value nelze zadat jako výstupní parametr procedury.

JEN PRO ČTENÍ

Označuje, že parametr nelze aktualizovat ani upravit v těle procedury. Pokud je typ parametru typ hodnoty tabulky, musí být zadán readONLY.

RECOMPILE

Označuje, že databázový stroj neuloží plán dotazu pro tento postup do mezipaměti a při každém spuštění ho vynutí kompilaci. Další informace o důvodech vynucení rekompilu naleznete v tématu Rekompilování uložené procedury. Tuto možnost nelze použít, pokud je zadána replikace for replication nebo pro procedury CLR.

Pokud chcete databázovému stroji dát pokyn, aby zahodil plány dotazů pro jednotlivé dotazy uvnitř procedury, použijte nápovědu k dotazu RECOMPILE v definici dotazu. Další informace naleznete v tématu Nápovědy k dotazům (Transact-SQL).

ŠIFROVÁNÍ

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database, SQL databázi v Microsoft Fabric.

Označuje, že SQL Server převede původní text příkazu CREATE PROCEDURE na obfuskovaný formát. Výstup obfuskace není přímo viditelný v žádném zobrazení katalogu na SQL Serveru. Uživatelé, kteří nemají přístup k systémovým tabulkám nebo databázovým souborům, nemůžou načíst obfuskovaný text. Text je však k dispozici privilegovaným uživatelům, kteří mají přístup k systémovým tabulkám přes port DAC nebo přímo přistupovat k databázovým souborům. Uživatelé, kteří mohou k procesu serveru připojit ladicí program, mohou také načíst dešifrovanou proceduru z paměti za běhu. Další informace o přístupu k systémovým metadatům naleznete v tématu Konfigurace viditelnosti metadat.

Tato možnost není platná pro procedury CLR.

Postupy vytvořené pomocí této možnosti nelze publikovat jako součást replikace SQL Serveru.

Klauzule EXECUTE AS

Určuje kontext zabezpečení, pod kterým se má procedura provést.

Pro nativně zkompilované uložené procedury neexistují žádná omezení EXECUTE AS klauzule. V SQL Serveru 2014 (12.x) a starších verzích SELFjsou klauzule , OWNERa 'user_name' podporovány v nativních zkompilovaných uložených procedurách.

Další informace naleznete v tématu EXECUTE AS – klauzule (Transact-SQL).

PRO REPLIKACI

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database, SQL databázi v Microsoft Fabric.

Určuje, že se procedura vytvoří pro replikaci. V důsledku toho se nedá spustit pro odběratele. Procedura vytvořená s možností FOR REPLICATION se používá jako filtr procedur a provádí se pouze během replikace. Parametry nelze deklarovat, pokud je zadána funkce FOR REPLICATION. Pro procedury CLR není možné zadat replikaci. Možnost REKOMPIL je ignorována pro procedury vytvořené s funkcí FOR REPLICATION.

Procedura FOR REPLICATION má typ objektu RF v sys.objects a sys.procedures.

{ [ BEGIN ] sql_statement [;] [ ... n ] [ END ] }

Jeden nebo více Transact-SQL příkazů, které tvoří tělo procedury. K uzavření příkazů můžete použít volitelná klíčová slova BEGIN a END. Informace najdete v části Osvědčené postupy, Obecné poznámky a Omezení a Omezení, které následují.

EXTERNÍ NÁZEV assembly_name. class_name. method_name

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database, SQL databázi v Microsoft Fabric.

Určuje metodu sestavení rozhraní .NET Framework pro proceduru CLR odkazovat. class_name musí být platný identifikátor SQL Serveru a musí existovat jako třída v sestavení. Pokud má třída kvalifikovaný název oboru názvů, který používá tečku (.) k oddělení částí oboru názvů, musí být název třídy oddělený pomocí závorek ([]) nebo uvozovek (""). Zadaná metoda musí být statickou metodou třídy.

SQL Server ve výchozím nastavení nemůže spustit kód CLR. Můžete vytvářet, upravovat a odstraňovat databázové objekty, které odkazují na moduly common language runtime; Tyto odkazy však nelze spustit na SQL Serveru, dokud nepovolíte možnost povolení clr. Pokud chcete tuto možnost povolit, použijte sp_configure.

Poznámka:

Procedury CLR nejsou podporovány v obsažené databázi.

ATOMOVÉ S

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Označuje spuštění atomické uložené procedury. Změny jsou potvrzeny nebo všechny změny vráceny zpět vyvoláním výjimky. Blok ATOMIC WITH se vyžaduje pro nativně zkompilované uložené procedury.

Pokud procedura RETURNs (explicitně prostřednictvím příkazu RETURN nebo implicitně dokončením provádění), je potvrzena práce prováděná postupem. Pokud se procedura THROWs, práce prováděná postupem se vrátí zpět.

XACT_ABORT je ve výchozím nastavení v atomovém bloku zapnutý a nejde ho změnit. XACT_ABORT určuje, zda SQL Server automaticky vrátí aktuální transakci, když příkaz Transact-SQL vyvolá chybu za běhu.

Následující možnosti SET jsou vždy zapnuté v bloku ATOMIC a nelze je změnit.

  • Nastavení CONCAT_NULL_YIELDS_NULL
  • QUOTED_IDENTIFIER, ARITHABORT
  • NOCOUNT
  • ANSI_NULLS
  • ANSI_WARNINGS

Možnosti SET nelze změnit uvnitř bloků ATOMIC. Možnosti SET v uživatelské relaci se nepoužívají v oboru nativně kompilovaných uložených procedur. Tyto možnosti jsou opraveny v době kompilace.

Operace BEGIN, ROLLBACK a COMMIT nelze použít uvnitř atomového bloku.

Nativně zkompilovaná uložená procedura existuje jeden blok ATOMIC, který je ve vnějším rozsahu procedury. Bloky nelze vnořit. Další informace o atomických blocích naleznete v tématu Nativní kompilace uložených procedur.

NULL | NE NULL

Určuje, zda jsou v parametru povoleny hodnoty null. Hodnota NULL je výchozí.

NATIVE_COMPILATION

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Označuje, že procedura je nativně zkompilována. NATIVE_COMPILATION, SCHEMABINDING a EXECUTE AS lze zadat v libovolném pořadí. Další informace naleznete v tématu Nativně zkompilované uložené procedury.

SCHEMABINDING

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Zajišťuje, že tabulky, na které odkazuje procedura, nelze vynechat ani změnit. FUNKCE SCHEMABINDING se vyžaduje v nativně zkompilovaných uložených procedurách. (Další informace naleznete v tématu Nativní kompilované uložené procedury.) Omezení SCHEMABINDING jsou stejná jako u uživatelem definovaných funkcí. Další informace naleznete v části SCHEMABINDING v CREATE FUNCTION (Transact-SQL).

JAZYK = [N] 'jazyk'

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Ekvivalent možnosti relace SET LANGUAGE (Transact-SQL). JAZYK = [N] 'jazyk' je povinný.

ÚROVEŇ IZOLACE TRANSAKCÍ

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Vyžaduje se pro nativně zkompilované uložené procedury. Určuje úroveň izolace transakce pro uloženou proceduru. Možnosti jsou následující:

Další informace o těchto možnostech naleznete v tématu SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

OPAKOVATELNÉ ČTENÍ

Určuje, že příkazy nemohou číst data, která byla změněna, ale dosud potvrzena jinými transakcemi. Pokud jiná transakce upraví data, která byla načtena aktuální transakcí, aktuální transakce selže.

SERIALIZOVATELNÝ

Určuje následující:

  • Příkazy nemohou číst data, která byla změněna, ale dosud potvrzena jinými transakcemi.
  • Pokud jiná transakce upraví data, která byla načtena aktuální transakcí, aktuální transakce selže.
  • Pokud jiná transakce vloží nové řádky s hodnotami klíče, které by spadají do rozsahu klíčů přečtených libovolnými příkazy v aktuální transakci, aktuální transakce selže.

SNÍMEK

Určuje, že data přečtená libovolným příkazem v transakci jsou transakční konzistentní verze dat, která existovala na začátku transakce.

DATEFIRST = číslo

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Určuje první den v týdnu na číslo od 1 do 7. DATEFIRST je nepovinný. Pokud není zadaný, nastavení se odvodí ze zadaného jazyka.

Další informace naleznete v tématu SET DATEFIRST (Transact-SQL).

DATEFORMAT = formát

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Určuje pořadí částí kalendářního data měsíce, dne a roku pro interpretaci řetězce znaků date, smalldatetime, datetime, datetime2 a datetimeoffset . Funkce DATEFORMAT je volitelná. Pokud není zadaný, nastavení se odvodí ze zadaného jazyka.

Další informace naleznete v tématu SET DATEFORMAT (Transact-SQL).

DELAYED_DURABILITY = { VYPNUTO | ZAPNUTO }

Platí na: SQL Server 2014 (12.x) a pozdější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric.

Potvrzení transakcí SQL Serveru můžou být buď plně odolná, výchozí nebo zpožděná odolná.

Další informace naleznete v tématu Řízení odolnosti transakce.

Jednoduché příklady

Abychom vám pomohli začít, tady jsou dva rychlé příklady: SELECT DB_NAME() AS ThisDB; vrátí název aktuální databáze. Tento příkaz můžete zabalit do uložené procedury, například:

CREATE PROC What_DB_is_this
AS
SELECT DB_NAME() AS ThisDB;

Volání procedury úložiště pomocí příkazu: EXEC What_DB_is_this;

Trochu složitější je poskytnout vstupní parametr, aby byl postup flexibilnější. Například:

CREATE PROC What_DB_is_that @ID INT
AS
SELECT DB_NAME(@ID) AS ThatDB;

Při volání procedury zadejte číslo ID databáze. Například EXEC What_DB_is_that 2; vrátí tempdb.

Další příklady najdete v příkladech na konci tohoto článku.

Osvědčené postupy

I když se nejedná o vyčerpávající seznam osvědčených postupů, můžou tyto návrhy zlepšit výkon postupu.

  • Jako první příkaz v těle procedury použijte příkaz SET NOCOUNT ON. To znamená, že ho umístěte hned za klíčové slovo AS. Tím vypnete zprávy, které SQL Server odešle zpět klientovi po spuštění příkazů SELECT, INSERT, UPDATE, MERGE a DELETE. Tím se výstup vygeneruje na minimum, aby byl přehledný. Dnešní hardware ale nemá měřitelné výhody výkonu. Informace naleznete v tématu SET NOCOUNT (Transact-SQL).
  • Názvy schémat použijte při vytváření nebo odkazování na databázové objekty v postupu. Databázovému stroji trvá méně času zpracování, než se přeloží názvy objektů, pokud nemusí prohledávat více schémat. Zabraňuje také problémům s oprávněním a přístupem způsobeným přiřazením výchozího schématu uživatele při vytváření objektů bez zadání schématu.
  • Vyhněte se obtékání funkcí kolem sloupců zadaných v klauzulích WHERE a JOIN. Tím sloupce nejsou deterministické a brání procesoru dotazů v používání indexů.
  • Nepoužívejte skalární funkce v příkazech SELECT, které vracejí mnoho řádků dat. Vzhledem k tomu, že skalární funkce musí být použita na každý řádek, výsledné chování je jako zpracování založené na řádcích a snižuje výkon.
  • Vyhněte se použití SELECT *. Místo toho zadejte požadované názvy sloupců. To může zabránit některým chybám databázového stroje, které zastaví provádění procedury. Například SELECT * příkaz, který vrátí data z tabulky se 12 sloupci a potom vloží tato data do dočasné tabulky s 12 sloupci, dokud se nezmění počet nebo pořadí sloupců v obou tabulkách.
  • Vyhněte se zpracování nebo vracení příliš velkého množství dat. V kódu procedury co nejdříve zužte výsledky tak, aby se všechny následné operace prováděné postupem prováděly pomocí nejmenší datové sady. Odešlete jenom základní data do klientské aplikace. Je efektivnější než odesílání dodatečných dat přes síť a vynucení klientské aplikace pro práci zbytečně velkými sadami výsledků.
  • Použijte explicitní transakce pomocí BEGIN/COMMIT TRANSACTION a udržujte transakce co nejkratší. Delší transakce znamenají delší uzamčení záznamů a větší potenciál pro zablokování.
  • Použijte Transact-SQL TRY... Funkce CATCH pro zpracování chyb uvnitř procedury ZKUSIT... CATCH může zapouzdření celého bloku příkazů Transact-SQL. To nejen vytváří méně režijních nákladů na výkon, ale také zvyšuje přesnost zasílání zpráv o chybách s výrazně méně programováním.
  • Ve všech sloupcích tabulky odkazovaných příkazy CREATE TABLE nebo ALTER TABLE Transact-SQL v textu procedury použijte klíčové slovo DEFAULT. Tím zabráníte předání hodnoty NULL sloupcům, které neumožňují hodnoty null.
  • Pro každý sloupec v dočasné tabulce použijte hodnotu NULL nebo NOT NULL. Možnosti ANSI_DFLT_ON a ANSI_DFLT_OFF řídí způsob, jakým databázový stroj přiřazuje sloupcům atributy NULL nebo NOT NULL, pokud tyto atributy nejsou zadané v příkazu CREATE TABLE nebo ALTER TABLE. Pokud připojení provede proceduru s různými nastaveními pro tyto možnosti, než je připojení, které proceduru vytvořilo, můžou mít sloupce tabulky vytvořené pro druhé připojení jinou hodnotu null a vykazují odlišné chování. Pokud je pro každý sloupec explicitně uvedena hodnota NULL nebo NOT NULL, vytvoří se dočasné tabulky se stejnou hodnotou null pro všechna připojení, která proceduru spouští.
  • Použijte příkazy pro úpravy, které převádějí hodnoty null a zahrnují logiku, která eliminuje řádky s hodnotami null z dotazů. Mějte na paměti, že v jazyce Transact-SQL není hodnota NULL prázdná nebo "nic". Jedná se o zástupný symbol pro neznámou hodnotu a může způsobit neočekávané chování, zejména při dotazování na sady výsledků nebo použití funkcí AGGREGATE.
  • Použijte operátor UNION ALL místo operátorů UNION nebo OR, pokud není potřeba konkrétní hodnoty. Operátor UNION ALL vyžaduje méně režijní náklady na zpracování, protože duplicity nejsou vyfiltrovány ze sady výsledků.

Poznámky

Neexistuje žádná předdefinovaná maximální velikost procedury.

Proměnné zadané v postupu můžou být uživatelem definované nebo systémové proměnné, například @@SPID.

Při prvním spuštění procedury se zkompiluje, aby určil optimální plán přístupu pro načtení dat. Následné spuštění postupu může plán již vygenerovaný znovu použít, pokud stále zůstává v mezipaměti plánu databázového stroje.

Jeden nebo více postupů se může spustit automaticky při spuštění SQL Serveru. Postupy musí vytvořit správce systému v master databázi a provést v rámci pevné role serveru správce systému jako proces na pozadí. Postupy nemohou mít žádné vstupní ani výstupní parametry. Další informace naleznete v tématu Spuštění uložené procedury.

Procedury jsou vnořené, když jedna procedura volá jiný nebo spouští spravovaný kód odkazováním na rutinu, typ nebo agregaci CLR. Procedury a odkazy na spravovaný kód můžou být vnořené až na 32 úrovní. Úroveň vnoření se zvýší o jednu, když volána procedura nebo odkaz spravovaného kódu zahájí provádění a sníží se o jednu, když se dokončí provádění volaná procedura nebo odkaz spravovaného kódu. Metody vyvolané ze spravovaného kódu se nezapočítávají do limitu úrovně vnoření. Pokud však uložená procedura CLR provádí operace přístupu k datům prostřednictvím spravovaného poskytovatele SQL Serveru, přidá se do přechodu ze spravovaného kódu na SQL další úroveň vnoření.

Pokus o překročení maximální úrovně vnoření způsobí selhání celého volajícího řetězce. Pomocí funkce @@NESTLEVEL můžete vrátit úroveň vnoření aktuální uložené procedury.

Interoperability

Databázový stroj uloží nastavení QUOTED_IDENTIFIER SET i SET ANSI_NULLS při vytvoření nebo změně procedury Transact-SQL. Tato původní nastavení se použijí při spuštění procedury. Proto se při spuštění procedury ignorují všechna nastavení relace klienta pro nastavení QUOTED_IDENTIFIER a ANSI_NULLS SET.

Jiné možnosti SADY, jako je SET ARITHABORT, SET ANSI_WARNINGS nebo SET ANSI_PADDINGS, se při vytvoření nebo úpravě procedury neuloží. Pokud logika procedury závisí na konkrétním nastavení, zahrňte na začátku postupu příkaz SET, který zaručuje odpovídající nastavení. Když se příkaz SET spustí z procedury, nastavení zůstane v platnosti pouze po dokončení procedury. Nastavení se pak obnoví na hodnotu, kterou procedura měla při volání. To umožňuje jednotlivým klientům nastavit požadované možnosti, aniž by to mělo vliv na logiku procedury.

Jakýkoli příkaz SET lze zadat uvnitř procedury, s výjimkou SET SHOWPLAN_TEXT a SET SHOWPLAN_ALL. Musí se jednat o jediné příkazy v dávce. Zvolená možnost SET zůstane v platnosti během provádění procedury a pak se vrátí k dřívějšímu nastavení.

Poznámka:

SET ANSI_WARNINGS není dodržen při předávání parametrů v procedurě, uživatelem definované funkci nebo při deklarování a nastavení proměnných v dávkovém příkazu. Pokud je například proměnná definována jako char(3) a pak je nastavená na hodnotu větší než tři znaky, data se zkrátí na definovanou velikost a příkaz INSERT nebo UPDATE bude úspěšný.

Limity a omezení

Příkaz CREATE PROCEDURE nelze kombinovat s jinými příkazy Transact-SQL v jedné dávce.

Následující příkazy nelze použít kdekoli v těle uložené procedury.

CREATE SET USE
VYTVOŘIT AGREGÁT SET SHOWPLAN_TEXT POUŽÍVEJTE database_name
VYTVOŘIT VÝCHOZÍ NASTAVTE SHOWPLAN_XML
VYTVOŘIT PRAVIDLO NASTAVIT PARSEONLY
VYTVOŘENÍ SCHÉMATU NASTAVTE SHOWPLAN_ALL
CREATE nebo ALTER TRIGGER
CREATE nebo ALTER FUNCTION
CREATE nebo ALTER PROCEDURE
VYTVOŘIT nebo ALTER ZOBRAZIT

Procedura může odkazovat na tabulky, které ještě neexistují. Při vytváření se provádí pouze kontrola syntaxe. Procedura se nezkompiluje, dokud se nespustí poprvé. Pouze během kompilace jsou všechny objekty odkazované v postupu vyřešené. Proto je možné úspěšně vytvořit syntakticky správný postup, který odkazuje na tabulky, které neexistují; Pokud však odkazované tabulky neexistují, procedura v době provádění selže.

Název funkce nelze zadat jako výchozí hodnotu parametru nebo jako hodnotu předanou parametru při provádění procedury. Funkci ale můžete předat jako proměnnou, jak je znázorněno v následujícím příkladu.

-- Passing the function value as a variable.
DECLARE @CheckDate DATETIME = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

Pokud procedura provede změny ve vzdálené instanci SQL Serveru, změny se nedají vrátit zpět. Vzdálené procedury se neúčastní transakcí.

Aby databázový stroj odkazoval na správnou metodu při přetížení v rozhraní .NET Framework, musí mít metoda zadaná v klauzuli EXTERNAL NAME následující vlastnosti:

  • Deklarovat jako statickou metodu.
  • Přijme stejný počet parametrů jako počet parametrů procedury.
  • Použijte typy parametrů, které jsou kompatibilní s datovými typy odpovídajících parametrů procedury SQL Serveru. Informace o porovnávání datových typů SQL Serveru s datovými typy rozhraní .NET Framework naleznete v tématu Mapování dat parametrů CLR.

Metadatové informace

Následující tabulka uvádí zobrazení katalogu a zobrazení dynamické správy, která můžete použít k vrácení informací o uložených procedurách.

Zobrazit Description
sys.sql_modules Vrátí definici Transact-SQL procedury. Text procedury vytvořené s možností ŠIFROVÁNÍ nelze zobrazit pomocí sys.sql_modules zobrazení katalogu.
sys.assembly_modules Vrátí informace o procedurě CLR.
sys.parameters Vrátí informace o parametrech definovaných v rámci procedury.
sys.sql_expression_dependenciessys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities Vrátí objekty, na které odkazuje procedura.

K odhadu velikosti kompilovaného postupu použijte následující čítače sledování výkonu.

Název objektu sledování výkonu Název čítače monitorování výkonu
SQLServer: Plánování objektu mezipaměti Poměr přístupů do mezipaměti
Ukládání stránek do mezipaměti
Počet objektů mezipaměti 1

1 Tyto čítače jsou k dispozici pro různé kategorie objektů mezipaměti, včetně ad hoc Transact-SQL, připravený transact-SQL, procedur, triggerů atd. Další informace naleznete v tématu SQL Server, Plan Cache Object.

Povolení

Vyžaduje CREATE PROCEDURE oprávnění v databázi a ALTER oprávnění ke schématu, ve kterém se procedura vytváří, nebo vyžaduje členství v db_ddladmin pevné databázové roli.

U uložených procedur CLR vyžaduje vlastnictví sestavení odkazovaného v klauzuli EXTERNAL NAME nebo REFERENCES oprávnění k danému sestavení.

CREATE PROCEDURE a tabulky optimalizované pro paměť

K tabulkám optimalizovaným pro paměť je možné přistupovat prostřednictvím tradičních i nativně kompilovaných uložených procedur. Nativní procedury jsou ve většině případů efektivnějším způsobem. Další informace naleznete v tématu Nativně zkompilované uložené procedury.

Následující ukázka ukazuje, jak vytvořit nativně zkompilovanou uloženou proceduru, která přistupuje k tabulce dbo.Departmentsoptimalizované pro paměť:

CREATE PROCEDURE dbo.usp_add_kitchen @dept_id INT, @kitchen_count INT NOT NULL
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')

UPDATE dbo.Departments
SET kitchen_count = ISNULL(kitchen_count, 0) + @kitchen_count
WHERE ID = @dept_id
END;
GO

Procedura vytvořená bez NATIVE_COMPILATION nelze změnit na nativně zkompilovanou uloženou proceduru.

Diskuzi o programovatelnosti v nativně zkompilovaných uložených procedurách, podporované oblasti pro dotazy a operátory naleznete v tématu Podporované funkce pro nativně kompilované moduly T-SQL.

Examples

Kategorie Doporučené prvky syntaxe
Základní syntaxe VYTVOŘENÍ POSTUPU
Předávání parametrů @parameter
  • = výchozí
  • VÝSTUP
  • Table-valued – typ parametru
  • KURZOR SE LIŠÍ
Úprava dat pomocí uložené procedury Aktualizace
Zpracování chyb TRY...CATCH
Obfuscování definice procedury S ŠIFROVÁNÍM
Vynucení rekompilu procedury S REKOMPILEM
Nastavení kontextu zabezpečení VYKONAT JAKO

Základní syntaxe

Příklady v této části ukazují základní funkce příkazu CREATE PROCEDURE pomocí minimální požadované syntaxe.

A. Vytvoření procedury Transact-SQL

Následující příklad vytváří uloženou proceduru, která vrací všechny zaměstnance (křestní a příjmení jako dodaná), jejich pracovní pozice a názvy oddělení z pohledu v databázi AdventureWorks2025. Tento postup nepoužívá žádné parametry. Příklad pak ukazuje tři metody provedení procedury.

CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SET NOCOUNT ON;
    SELECT LastName, FirstName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment;
GO

SELECT * FROM HumanResources.vEmployeeDepartment;

Postup uspGetEmployees lze provést následujícími způsoby:

EXECUTE HumanResources.uspGetAllEmployees;
GO
-- Or
EXEC HumanResources.uspGetAllEmployees;
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetAllEmployees;

B. Vrácení více než jedné sady výsledků

Následující postup vrátí dvě sady výsledků.

CREATE PROCEDURE dbo.uspMultipleResults
AS
SELECT TOP(10) BusinessEntityID, Lastname, FirstName FROM Person.Person;
SELECT TOP(10) CustomerID, AccountNumber FROM Sales.Customer;
GO

C. Vytvoření uložené procedury CLR

Následující příklad vytvoří proceduru GetPhotoFromDB , která odkazuje na GetPhotoFromDB metodu LargeObjectBinary třídy v HandlingLOBUsingCLR sestavení. Před vytvořením procedury se sestavení zaregistruje HandlingLOBUsingCLR v místní databázi. Příklad předpokládá sestavení vytvořené z assembly_bits.

Platí na: SQL Server 2008 (10.0.x) a novější verze, Azure SQL databázi, SQL databázi v Microsoft Fabric, při použití assembleru vytvořeného z assembly_bits.

CREATE ASSEMBLY HandlingLOBUsingCLR
FROM '\\MachineName\HandlingLOBUsingCLR\bin\Debug\HandlingLOBUsingCLR.dll';
GO
CREATE PROCEDURE dbo.GetPhotoFromDB
(
    @ProductPhotoID INT
    , @CurrentDirectory NVARCHAR(1024)
    , @FileName NVARCHAR(1024)
)
AS EXTERNAL NAME HandlingLOBUsingCLR.LargeObjectBinary.GetPhotoFromDB;
GO

Předání parametrů

Příklady v této části ukazují, jak pomocí vstupních a výstupních parametrů předávat hodnoty do a z uložené procedury.

D. Vytvoření procedury se vstupními parametry

Následující příklad vytvoří uloženou proceduru, která vrátí informace pro konkrétního zaměstnance předáním hodnot pro jméno a příjmení zaměstnance. Tento postup přijímá pouze přesné shody pro předané parametry.

IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees
    @LastName NVARCHAR(50),
    @FirstName NVARCHAR(50)
AS

    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName = @FirstName AND LastName = @LastName;
GO

Postup uspGetEmployees lze provést následujícími způsoby:

EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman';
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetEmployees N'Ackerman', N'Pilar';

E. Použití procedury s parametry zástupných znaků

Následující příklad vytvoří uloženou proceduru, která vrací informace pro zaměstnance předáním úplných nebo částečných hodnot pro křestní jméno a příjmení zaměstnance. Tento vzor postupu odpovídá předaným parametrům nebo pokud není zadaný, použije přednastavené výchozí nastavení (příjmení začínající písmenem D).

IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees2;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees2
    @LastName NVARCHAR(50) = N'D%',
    @FirstName NVARCHAR(50) = N'%'
AS
    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;

Postup uspGetEmployees2 lze provést v mnoha kombinacích. Tady je zobrazeno jenom několik možných kombinací.

EXECUTE HumanResources.uspGetEmployees2;
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Wi%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 @FirstName = N'%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'H%', N'S%';

F. Použití parametrů OUTPUT

Následující příklad vytvoří proceduru uspGetList . Tento postup vrátí seznam produktů, které mají ceny, které nepřekračují zadanou částku. Příklad ukazuje použití více SELECT příkazů a více OUTPUT parametrů. Parametry OUTPUT umožňují externí proceduru, dávku nebo více než jeden příkaz Transact-SQL pro přístup k hodnotě nastavené během provádění procedury.

IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
    DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product VARCHAR(40)
    , @MaxPrice MONEY
    , @ComparePrice MONEY OUTPUT
    , @ListPrice MONEY OUT
AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

Spuštěním uspGetList vrátíte seznam produktů Adventure Works (Bikes), které stojí méně než $700. Parametry OUTPUT@Cost a @ComparePrices používají se s jazykem control-of-flow k vrácení zprávy v okně Zprávy .

Poznámka:

Proměnná OUTPUT musí být definována při vytvoření procedury a také při použití proměnné. Název parametru a název proměnné se nemusí shodovat; Datový typ a umístění parametru se však musí shodovat, pokud @ListPrice = se nepoužije proměnná.

DECLARE @ComparePrice MONEY, @Cost MONEY;
EXECUTE Production.uspGetList '%Bikes%', 700,
    @ComparePrice OUT,
    @Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
    PRINT 'These products can be purchased for less than
    $'+RTRIM(CAST(@ComparePrice AS VARCHAR(20)))+'.'
END
ELSE
    PRINT 'The prices for all products in this category exceed
    $'+ RTRIM(CAST(@ComparePrice AS VARCHAR(20)))+'.';

Tady je částečná sada výsledků:

Product                     List Price
--------------------------  ----------
Road-750 Black, 58          539.99
Mountain-500 Silver, 40     564.99
Mountain-500 Silver, 42     564.99
...
Road-750 Black, 48          539.99
Road-750 Black, 52          539.99

(14 row(s) affected)

These items can be purchased for less than $700.00.

G. Použití parametru s hodnotou tabulky

Následující příklad používá typ parametru s hodnotou tabulky k vložení více řádků do tabulky. Příklad vytvoří typ parametru, deklaruje proměnnou tabulky, která na ni odkazuje, vyplní seznam parametrů a pak předá hodnoty uložené proceduře. Uložená procedura používá hodnoty k vložení více řádků do tabulky.

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2022].[Production].[Location]
       ([Name]
       , [CostRate]
       , [Availability]
       , [ModifiedDate])
    SELECT *, 0, GETDATE()
    FROM @TVP;
GO

/* Declare a variable that references the type. */
DECLARE @LocationTVP
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM
    [AdventureWorks2022].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
H. Použití parametru kurzoru výstupu

Následující příklad používá parametr kurzoru OUTPUT k předání kurzoru, který je místní pro proceduru zpět do volající dávky, procedury nebo triggeru.

Nejprve vytvořte proceduru, která deklaruje, a pak otevře kurzor na Currency tabulce:

CREATE PROCEDURE dbo.uspCurrencyCursor
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO

Potom spusťte dávku, která deklaruje místní proměnnou kurzoru, spustí proceduru pro přiřazení kurzoru k místní proměnné a potom načte řádky z kurzoru.

DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
    FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO

Úprava dat pomocí uložené procedury

Příklady v této části ukazují, jak vložit nebo upravit data v tabulkách nebo zobrazeních zahrnutím příkazu DML (Data Manipulat Language) v definici procedury.

I. Použití funkce UPDATE v uložené proceduře

Následující příklad používá příkaz UPDATE v uložené procedurě. Procedura přebírá jeden vstupní parametr @NewHours a jeden výstupní parametr @RowCount. Hodnota @NewHours parametru se používá v příkazu UPDATE k aktualizaci sloupce VacationHours v tabulce HumanResources.Employee. Výstupní @RowCount parametr slouží k vrácení počtu řádků ovlivněných místní proměnné. Výraz CASE se používá v klauzuli SET k podmíněnému určení hodnoty nastavené pro VacationHours. Pokud je zaměstnanec placen každou hodinu (SalariedFlag = 0), VacationHours je nastaven na aktuální počet hodin plus hodnota zadaná v @NewHours; v opačném případě VacationHours je nastavena na hodnotu zadanou v @NewHours.

CREATE PROCEDURE HumanResources.Update_VacationHours
@NewHours SMALLINT, @Rowcount INT OUTPUT
AS
SET NOCOUNT ON;
UPDATE HumanResources.Employee
SET VacationHours =
    ( CASE
        WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
        ELSE @NewHours
        END
    )
WHERE CurrentFlag = 1;
SET @Rowcount = @@rowcount;

GO
DECLARE @Rowcount INT
EXEC HumanResources.Update_VacationHours 40, @Rowcount OUTPUT
PRINT @Rowcount;

Zpracování chyb

Příklady v této části ukazují metody pro zpracování chyb, ke kterým může dojít při spuštění uložené procedury.

J. Použít try... CHYTIT

Následující příklad použití try... Konstruktor CATCH pro vrácení informací o chybě zachycených během provádění uložené procedury.

CREATE PROCEDURE Production.uspDeleteWorkOrder ( @WorkOrderID INT )
AS
SET NOCOUNT ON;
BEGIN TRY
  BEGIN TRANSACTION
  -- Delete rows from the child table, WorkOrderRouting, for the specified work order.
    DELETE FROM Production.WorkOrderRouting
    WHERE WorkOrderID = @WorkOrderID;
  -- Delete the rows from the parent table, WorkOrder, for the specified work order.
    DELETE FROM Production.WorkOrder
    WHERE WorkOrderID = @WorkOrderID;
  COMMIT
END TRY

BEGIN CATCH
  -- Determine if an error occurred.
  IF @@TRANCOUNT > 0
    ROLLBACK

  -- Return the error information.
  DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT;
  SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY();
  RAISERROR(@ErrorMessage, @ErrorSeverity, 1);
END CATCH;

GO
EXEC Production.uspDeleteWorkOrder 13;
GO
/* Intentionally generate an error by reversing the order in which rows
   are deleted from the parent and child tables. This change does not
   cause an error when the procedure definition is altered, but produces
   an error when the procedure is executed.
*/
ALTER PROCEDURE Production.uspDeleteWorkOrder ( @WorkOrderID INT )
AS

BEGIN TRY
  BEGIN TRANSACTION
  -- Delete the rows from the parent table, WorkOrder, for the specified work order.
    DELETE FROM Production.WorkOrder
    WHERE WorkOrderID = @WorkOrderID;

  -- Delete rows from the child table, WorkOrderRouting, for the specified work order.
    DELETE FROM Production.WorkOrderRouting
    WHERE WorkOrderID = @WorkOrderID;
  COMMIT TRANSACTION
END TRY

BEGIN CATCH
  -- Determine if an error occurred.
  IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION

  -- Return the error information.
  DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT;
  SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY();
  RAISERROR(@ErrorMessage, @ErrorSeverity, 1);
END CATCH;
GO
-- Execute the altered procedure.
EXEC Production.uspDeleteWorkOrder 15;
GO
DROP PROCEDURE Production.uspDeleteWorkOrder;

Obfuscate definici procedury

Příklady v této části ukazují, jak obfuscate definici uložené procedury.

K. Použití možnosti WITH ENCRYPTION

Následující příklad vytvoří proceduru HumanResources.uspEncryptThis .

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database, SQL databázi v Microsoft Fabric.

CREATE PROCEDURE HumanResources.uspEncryptThis
WITH ENCRYPTION
AS
    SET NOCOUNT ON;
    SELECT BusinessEntityID, JobTitle, NationalIDNumber,
        VacationHours, SickLeaveHours
    FROM HumanResources.Employee;
GO

Možnost WITH ENCRYPTION obfusuje definici procedury při dotazování systémového katalogu nebo pomocí funkcí metadat, jak je znázorněno v následujících příkladech.

Spustit sp_helptext:

EXEC sp_helptext 'HumanResources.uspEncryptThis';

Tady je soubor výsledků.

The text for object 'HumanResources.uspEncryptThis' is encrypted.

Přímé dotazování zobrazení sys.sql_modules katalogu:

SELECT definition FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.uspEncryptThis');

Tady je soubor výsledků.

definition
--------------------------------
NULL

Poznámka:

Uložená procedura sp_helptext systému není ve službě Azure Synapse Analytics podporovaná. Místo toho použijte zobrazení katalogu objektů sys.sql_modules.

Vynucení rekompilu procedury

Příklady v této části používají klauzuli WITH RECOMPILE k vynucení rekompilu procedury při každém spuštění.

L. Použití možnosti WITH RECOMPILE

Klauzule WITH RECOMPILE je užitečná, když parametry zadané pro proceduru nejsou typické a kdy by se nový plán provádění neměl ukládat do mezipaměti ani ukládat do paměti.

IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspProductByVendor;
GO
CREATE PROCEDURE dbo.uspProductByVendor @Name VARCHAR(30) = '%'
WITH RECOMPILE
AS
    SET NOCOUNT ON;
    SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'
    FROM Purchasing.Vendor AS v
    JOIN Purchasing.ProductVendor AS pv
      ON v.BusinessEntityID = pv.BusinessEntityID
    JOIN Production.Product AS p
      ON pv.ProductID = p.ProductID
    WHERE v.Name LIKE @Name;

Nastavení kontextu zabezpečení

Příklady v této části používají klauzuli EXECUTE AS k nastavení kontextu zabezpečení, ve kterém se uložená procedura spouští.

M. Použití klauzule EXECUTE AS

Následující příklad ukazuje použití klauzule EXECUTE AS k určení kontextu zabezpečení, ve kterém lze provést proceduru. V tomto příkladu možnost CALLER určuje, že proceduru lze provést v kontextu uživatele, který ji volá.

CREATE PROCEDURE Purchasing.uspVendorAllInfo
WITH EXECUTE AS CALLER
AS
    SET NOCOUNT ON;
    SELECT v.Name AS Vendor, p.Name AS 'Product name',
      v.CreditRating AS 'Rating',
      v.ActiveFlag AS Availability
    FROM Purchasing.Vendor v
    INNER JOIN Purchasing.ProductVendor pv
      ON v.BusinessEntityID = pv.BusinessEntityID
    INNER JOIN Production.Product p
      ON pv.ProductID = p.ProductID
    ORDER BY v.Name ASC;
GO

N. Vytvoření vlastních sad oprávnění

Následující příklad používá funkci EXECUTE AS k vytvoření vlastních oprávnění pro operaci databáze. Některé operace, jako je NAPŘÍKLAD TRUNCATE TABLE, nemají udělená oprávnění. Zahrnutím příkazu TRUNCATE TABLE do uložené procedury a zadáním této procedury se provede jako uživatel, který má oprávnění k úpravě tabulky, můžete rozšířit oprávnění k zkrácení tabulky na uživatele, kterému udělíte oprávnění EXECUTE v rámci procedury.

CREATE PROCEDURE dbo.TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

O. Vytvoření uložené procedury, která spouští příkaz SELECT

Tento příklad ukazuje základní syntaxi pro vytvoření a spuštění procedury. Při spuštění dávky musí být příkaz CREATE PROCEDURE prvním příkazem. Pokud například chcete vytvořit následující uloženou proceduru v AdventureWorksPDW2022, nejprve nastavte kontext databáze a spusťte příkaz CREATE PROCEDURE.

-- Uses AdventureWorksDW database

--Run CREATE PROCEDURE as the first statement in a batch.
CREATE PROCEDURE Get10TopResellers
AS
BEGIN
    SELECT TOP (10) r.ResellerName, r.AnnualSales
    FROM DimReseller AS r
    ORDER BY AnnualSales DESC, ResellerName ASC;
END
;
GO

--Show 10 Top Resellers
EXEC Get10TopResellers;

Viz také