Podporované funkce pro nativně kompilované moduly T-SQL

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Toto téma obsahuje seznam oblastí povrchu T-SQL a podporovaných funkcí v těle nativně zkompilovaných modulů T-SQL, jako jsou uložené procedury ((CREATE PROCEDURETransact-SQL)), skalární uživatelem definované funkce, vložené funkce s hodnotami tabulky a triggery.

Podporované funkce týkající se definice nativních modulů najdete v tématu Podporované DDL pro nativní kompilované moduly T-SQL.

Úplné informace o nepodporovaných konstruktech a informace o tom, jak obejít některé nepodporované funkce v nativně kompilovaných modulech, najdete v tématu Problémy s migrací pro nativně kompilované uložené procedury. Další informace o nepodporovaných funkcích naleznete v tématu Transact-SQL Konstrukty nepodporované In-Memory OLTP.

Dotazování povrchové oblasti v nativních modulech

Podporují se následující konstrukce dotazů:

VÝRAZ CASE: CASE lze použít v libovolném příkazu nebo klauzuli, která umožňuje platný výraz.

  • Platí pro: SQL Server 2017 (14.x).
    Počínaje SQL Serverem 2017 (14.x) jsou teď příkazy CASE podporované pro nativně kompilované moduly T-SQL.

Klauzule SELECT:

  • Sloupce a aliasy názvů (s použitím syntaxe AS nebo =).

  • Skalární poddotazy

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x) se skalární poddotazy nyní podporují v nativně kompilovaných modulech.
  • VRCHOL*

  • SELECT DISTINCT

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x) se operátor DISTINCT podporuje v nativně kompilovaných modulech.

      • Agregace DISTINCT nejsou podporovány.
  • UNION a UNION ALL

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x) se teď operátory UNION a UNION ALL podporují v nativně kompilovaných modulech.
  • Přiřazení proměnných

Příkaz FROM:

  • FROM <tabulka nebo proměnná tabulky optimalizované pro paměť>

  • FROM <nativně zkompilovaná vložená TVF>

  • LEVÉ VNĚJŠÍ SPOJENÍ, PRAVÉ VNĚJŠÍ SPOJENÍ, KŘÍŽOVÉ SPOJENÍ A VNITŘNÍ SPOJENÍ.

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x) se teď joins podporují v nativně kompilovaných modulech.
  • Poddotazy [AS] table_alias. Další informace najdete v tématu FROM (Transact-SQL).

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x) se teď poddotazy podporují v nativně kompilovaných modulech.

Klauzule WHERE:

  • Predikát filtru JE [NOT] NULL

  • A, MEZI

  • NEBO NE, V, EXISTUJE

    • Platí pro: SQL Server 2016 (13.x). Počínaje SQL Serverem 2016 (13.x), operátory OR/NOT/IN/EXISTS jsou nyní podporovány v nativně kompilovaných modulech.

Klauzule GROUP BY:

  • Agregační funkce AVG, COUNT, COUNT_BIG, MIN, MAX a SUM.

  • Funkce MIN a MAX nejsou podporované pro typy nvarchar, char, varchar, varchar, varchar, varbinary a binary.

Klauzule ORDER BY:

  • Klauzule ORDER BY nepodporuje funkci DISTINCT.

  • Funkce GROUP BY (Transact-SQL) se podporuje, pokud se výraz v seznamu ORDER BY zobrazí doslovně v seznamu GROUP BY.

    • Například FUNKCE GROUP BY a + b ORDER BY a + b je podporována, ale funkce GROUP BY a, b ORDER BY a + b není.

MÍT klauzuli:

  • Podléhá stejným omezením výrazu jako klauzule WHERE.

ORDER BY a TOP jsou podporovány v nativně kompilovaných modulech s určitými omezeními.

  • V klauzuli TOP není podporována funkce WITH TIES ani PERCENT.

  • Klauzule ORDER BY nepodporuje funkci DISTINCT.

  • TOP v kombinaci s FUNKCÍ ORDER BY nepodporuje více než 8 192 při použití konstanty v klauzuli TOP .

    • Tento limit může být nižší v případě, že dotaz obsahuje spojení nebo agregační funkce. (Například s jedním spojením (dvěma tabulkami) je limit 4 096 řádků. Při dvou spojeních (tři tabulky) je limit 2 730 řádků.)
    • Výsledky větší než 8 192 můžete získat uložením počtu řádků do proměnné:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

Konstanta v klauzuli TOP ale vede k lepšímu výkonu v porovnání s použitím proměnné.

Tato omezení nativně kompilovaných příkazů Transact-SQL se nevztahují na přístup interpretovaného Transact-SQL k tabulkám optimalizovaným pro paměť.

Úprava dat

Podporují se následující příkazy DML.

  • INSERT VALUES (jeden řádek na každý příkaz) a INSERT ... SELECT

  • UPDATE

  • DELETE

  • WHERE je podporováno v příkazech UPDATE a DELETE.

Řízení jazyka toku

Podporují se následující konstrukty jazyka control-of-flow.

Podporované operátory

Podporují se následující operátory.

  • Relační operátory (Transact-SQL) (například >, , <= >a <=)

  • Unární operátory (+, -).

  • Binární operátory (*, /, +, -, % (modulo)).

    • Operátor plus (+) se podporuje u čísel i řetězců.
  • Logické operátory (AND, OR, NOT).

  • Bitové operátory ~, &, | a ^

  • Operátor APPLY

    • Platí pro: SQL Server 2017 (14.x).
      Počínaje SQL Serverem 2017 (14.x) je operátor APPLY podporován v nativně kompilovaných modulech.

Integrované funkce v nativně kompilovaných modulech

Následující funkce jsou podporovány v omezeních pro tabulky optimalizované pro paměť a v nativně kompilovaných modulech T-SQL.

  • Všechny matematické funkce (Transact-SQL)

  • Funkce kalendářních dat: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME a YEAR.

  • Řetězcové funkce: LEN, LTRIM, RTRIM a SUBSTRING.

    • Platí pro: SQL Server 2017 (14.x).
      Počínaje SQL Serverem 2017 (14.x) jsou podporovány také následující předdefinované funkce: TRIM, TRANSLATE a CONCAT_WS.
  • Funkce identit: SCOPE_IDENTITY

  • Funkce NULL: ISNULL

  • Funkce Uniqueidentifier: NEWID a NEWSEQUENTIALID

  • Funkce JSON

    • Platí pro: SQL Server 2017 (14.x).
      Počínaje SQL Serverem 2017 (14.x) se funkce JSON podporují v nativně kompilovaných modulech.
  • Chybové funkce: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY a ERROR_STATE

  • Systémové funkce: @@rowcount. Příkazy uvnitř nativně zkompilovaných uložených procedur aktualizují @@rowcount a @@rowcount můžete použít k určení počtu řádků ovlivněných posledním příkazem spuštěným v této nativně zkompilované uložené proceduře. @@rowcount se ale na začátku a na konci spuštění nativně zkompilované uložené procedury resetuje na 0.

  • Funkce zabezpečení: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().

  • Spouštění nativních modulů je možné vnořit.

Auditing

Auditování na úrovni procedury je podporováno v nativně zkompilovaných uložených procedurách.

Další informace o auditování najdete v tématu Vytvoření specifikace auditu serveru a auditu databáze.

Hinty pro tabulky a dotazy

Podporují se následující:

Další informace najdete v tématu Nápovědy k dotazům (Transact-SQL).

Omezení řazení

V dotazu, který používá TOP (Transact-SQL) a klauzuli ORDER BY (Transact-SQL) můžete seřadit větší než 8 000 řádků. Bez klauzule ORDER BY (Transact-SQL), TOP (Transact-SQL) však může seřadit až 8 000 řádků (méně řádků, pokud jsou spojení).

Pokud dotaz používá operátor TOP (Transact-SQL) i klauzuli ORDER BY (Transact-SQL), můžete pro operátor TOP zadat až 8192 řádků. Pokud zadáte více než 8192 řádků, zobrazí se chybová zpráva: Msg 41398, Level 16, State 1, Procedure< procedureName>, LineNumber<> Operátor TOP může vrátit maximálně 8192 řádků; <bylo požadováno číslo>.

Pokud nemáte klauzuli TOP, můžete seřadit libovolný počet řádků pomocí funkce ORDER BY.

Pokud nepoužíváte klauzuli ORDER BY, můžete použít libovolnou celočíselnou hodnotu s operátorem TOP.

Příklad s TOP N = 8192: Kompilace

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Příklad s TOP N > 8192: Kompilace se nezdařila.

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Omezení 8192 řádků se vztahuje pouze na TOP N, kde N je konstanta, jak je uvedeno v předchozích příkladech. Pokud potřebujete N hodnotu větší než 8192, můžete ji přiřadit proměnné a použít ji s TOP.

Příklad použití proměnné: Kompilace

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    DECLARE @v int = 8193   
    SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Omezení vrácených řádků: Existují dva případy, kdy může potenciálně snížit počet řádků, které může vrátit operátor TOP:

  • Použití JOIN v dotazu. Vliv JOINů na limitaci závisí na plánu dotazu.

  • Použití agregačních funkcí nebo odkazů k agregačním funkcím v klauzuli ORDER BY

Vzorec pro výpočet maximální N podporované v nejhorším scénáři v TOP N je: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).