Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure 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.
DECLARE @local_variable (Transact-SQL) může používat všechny podporované datové typy pro In-Memory OLTP a také typy tabulek optimalizované pro paměť. Proměnné lze deklarovat jako NULL nebo NOT NULL.
VYZKOUŠET... ZACHYTIT (Transact-SQL)
- Pokud chcete dosáhnout optimálního výkonu, použijte jeden blok TRY/CATCH pro celý nativně zkompilovaný modul T-SQL.
BEGIN ATOMIC (na vnější úrovni uložené procedury). Další podrobnosti najdete v tématu Atomické bloky.
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.
-
Platí pro: SQL Server 2017 (14.x).
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.
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.
-
Platí pro: SQL Server 2017 (14.x).
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.
-
Platí pro: SQL Server 2017 (14.x).
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í:
INDEX, FORCESCAN a FORCESEEK hinty, buď v syntaxi hintů tabulky, nebo v klauzuli OPTION (Transact-SQL) dotazu. Další informace naleznete v části Tipy pro tabulku (Transact-SQL).
Vynutit pořadí
Doporučení LOOP JOIN
OPTIMALIZOVAT PRO
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 ).