Volání uložené procedury (OLE DB)

Platí na:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformový systém (PDW)SQL databáze v Microsoft Fabric

Stáhnout ovladač OLE DB

Uložená procedura může mít nula nebo více parametrů. Může také vrátit hodnotu. Při použití ovladače OLE DB pro SQL Server mohou být parametry uložené procedury předávány prostřednictvím:

  • Pevné zakódování datové hodnoty.
  • Pomocí parametru (?) k určení parametrů se naváže programová proměnná na značku parametru a poté se hodnota dat vloží do programové proměnné.

Poznámka:

Při volání uložených procedur SQL Serveru s pojmenovanými parametry v databázi OLE musí názvy parametrů začínat znakem '@'. To je specifické omezení SQL Serveru. Ovladač OLE DB pro SQL Server toto omezení vynucuje přísněji než MDAC.

Pro podporu parametrů je rozhraní ICommandWithParameters vystaveno na příkazovém objektu. Pro použití parametrů spotřebitel nejprve popsá parametry poskytovateli voláním metody ICommandWithParameters::SetParameterInfo (nebo volitelně připraví volací příkaz, který volá metodu GetParameterInfo ). Spotřebitel pak vytvoří přístup, který určí strukturu bufferu a umístí do něj hodnoty parametrů. Nakonec předá rukojeť přístupového zařízení a ukazatel na buffer pro Execute. Při pozdějších voláních Execute uživatel vloží nové hodnoty parametrů do bufferu a volá Execute pomocí přístupového handle a ukazatele bufferu.

Příkaz, který volá dočasnou uloženou proceduru pomocí parametrů, musí nejprve zavolat ICommandWithParameters::SetParameterInfo pro definování informací parametru. Toto volání musí být provedeno dříve, než lze příkaz úspěšně připravit. Tento požadavek je způsoben, že interní název dočasné uložené procedury se liší od externího názvu používaného klientem. MSOLEDBSQL nemůže dotazovat systémové tabulky, aby určil informace o parametrech pro dočasnou uloženou proceduru.

Následující položky jsou kroky v procesu vazby parametrů:

  1. Doplňte informace parametrů v poli struktur DBPARAMBINDINFO; tedy název parametru, poskytovatelský název datového typu parametru nebo standardní název datového typu a podobně. Každá struktura v poli popisuje jeden parametr. Toto pole je poté předáno metodě SetParameterInfo .

  2. Zavolejte metodu ICommandWithParameters::SetParameterInfo pro popis parametrů poskytovateli. SetParameterInfo specifikuje nativní datový typ každého parametru. Argumenty SetParameterInfo jsou:

    • Počet parametrů, pro které nastavit informace o typu.
    • Pole parametrových ordinálů, pro které se nastavuje informace o typu.
    • Soubor struktur DBPARAMBINDINFO.
  3. Vytvořte parametrový accessor pomocí příkazu IAccessor::CreateAccessor . Accessor specifikuje strukturu bufferu a umisťuje do bufferu hodnoty parametrů. Příkaz CreateAccessor vytvoří accessor ze sady vazeb. Tyto vazby jsou uživatelem popsány pomocí řady struktur DBBINDING. Každé svázání přiřazuje jeden parametr k bufferu spotřebitele a obsahuje informace jako:

    • Ordinál parametru, na který se vazba vztahuje.
    • Co je vázáno (hodnota dat, délka a stav).
    • Offset v bufferu vůči každé z těchto částí.
    • Délka a typ datové hodnoty, jak existuje v bufferu spotřebitele.

    Accessor je identifikován podle své rukojeti, která je typu HACCESSOR. Tento handle se vrací metodou CreateAccessor . Kdykoli uživatel dokončí používání accessoru, musí zavolat metodu ReleaseAccessor , aby uvolnil paměť, kterou drží.

    Když uživatel zavolá metodu, například ICommand::Execute, předá handle přístupovému modulu a ukazatel samotnému bufferu. Poskytovatel používá tento přístupový modul k určení, jak přenést data obsažená v bufferu.

  4. Vyplňte strukturu DBPARAMS. Spotřebitelské proměnné, ze kterých jsou odebrány hodnoty vstupních parametrů a do kterých jsou zapisovány hodnoty výstupních parametrů, jsou za běhu předávány do ICommand::Execute ve struktuře DBPARAMS. Struktura DBPARAMS zahrnuje tři prvky:

    • Ukazatel na buffer, ze kterého poskytovatel získává data vstupních parametrů a do kterého vrací data výstupních parametrů podle vazeb specifikovaných přístupovým handlem.
    • Počet sad parametrů v bufferu.
    • Přístupový handle vytvořený v kroku 3.
  5. Příkaz spusťte pomocí ICommand::Execute.

Metody volání uložené procedury

Při spouštění uložené procedury v SQL Serveru podporuje ovladač OLE DB pro SQL Server:

  • Úniková sekvence ODBC CALL.
  • Úniková sekvence vzdáleného volání procedury (RPC).
  • Transact-SQL příkaz EXECUT.

Úniková sekvence ODBC CALL

Pokud znáte informace o parametrech, zavolejte metodu ICommandWithParameters::SetParameterInfo a popište parametry poskytovateli. Jinak, když je syntaxe ODBC CALL použita při volání uložené procedury, poskytovatel volá pomocnou funkci k nalezení informací o parametru uložené procedury.

Pokud si nejste jisti informacemi o parametrech (metadatech parametrů), doporučuje se syntaxe ODBC CALL.

Obecná syntaxe pro volání procedury pomocí escape sekvence ODBC CALL je:

{[?=]volejteprocedure_name[([parametr][,[parametr]]... )]}

Například:

{call SalesByCategory('Produce', '1995')}

Úniková sekvence RPC

Sekvence úniku RPC je podobná syntaxi ODBC CALL, která volá uloženou proceduru. Při opakovaném volání procedury je RPC escape sekvence nejlepší ze tří způsobů volání uložené procedury.

Když je sekvence RPC escape použita k vykonání uložené procedury, poskytovatel nevolá žádnou pomocnou funkci k určení informace parametru (jak tomu je u syntaxe ODBC CALL). Syntax RPC je jednodušší než syntax ODBC CALL, takže příkaz se parsuje rychleji, což zlepšuje výkon. V tomto případě je potřeba poskytnout informace o parametrech vykonáním ICommandWithParameters::SetParameterInfo.

RPC escape sekvence vyžaduje, abyste měli vrácenou hodnotu. Pokud uložená procedura nevrátí hodnotu, server ve výchozím nastavení vrátí 0. Také nemůžeš otevřít kurzor SQL Serveru na uložené procedurě. Uložená procedura je připravena implicitně a volání ICommandPrepare::P repare selže. Kvůli nemožnosti připravit RPC volání nelze dotazovat metadata sloupců; IColumnsInfo::GetColumnInfo a IColumnsRowset::GetColumnsRowset vrátí DB_E_NOTPREPARED.

Pokud znáte všechna metadata parametrů, doporučuje se RPC escape sekvence pro provádění uložených procedur.

Tento SQL je příkladem RPC escape sekvence pro volání uložené procedury:

{rpc SalesByCategory}

Pro ukázkovou aplikaci, která demonstruje RPC escape sekvenci, viz Execute a Stored Procedure (Using RPC Syntax) a Process Return Codes and Output Parameters (OLE DB).

Transact-SQL příkaz EXECUTE

Escape sekvence ODBC CALL a RPC escape sekvence jsou preferovanými metodami volání uložené procedury oproti příkazu EXEKUC . Ovladač OLE DB pro SQL Server využívá RPC mechanismus SQL Serveru k optimalizaci zpracování příkazů. Protokol RPC zvyšuje výkon tím, že eliminuje většinu zpracování parametrů a parsování příkazů, které se na serveru provádějí.

Následující SQL je příkladem příkazu EXECUTE Transact-SQL:

EXECUTE SalesByCategory 'Produce', '1995'

Viz také

Uložené procedury