Freigeben über


Unterstützte Konstrukte in nativ kompilierten gespeicherten Prozeduren

Dieses Thema enthält eine Liste der unterstützten Features für nativ kompilierte gespeicherte Prozeduren (CREATE PROCEDURE (Transact-SQL)):

Informationen zu Datentypen, die in nativ kompilierten gespeicherten Prozeduren unterstützt werden, finden Sie unter "Unterstützte Datentypen".

Vollständige Informationen zu nicht unterstützten Konstrukten und Informationen zum Umgehen einiger nicht unterstützter Features in systemeigenen gespeicherten Prozeduren finden Sie unter Migrationsprobleme für nativ kompilierte gespeicherte Prozeduren. Weitere Informationen zu nicht unterstützten Features finden Sie unter Transact-SQL Konstrukte, die von In-Memory OLTP nicht unterstützt werden.

Programmierbarkeit in nativ kompilierten gespeicherten Prozeduren

Folgendes wird unterstützt:

  • BEGIN ATOMIC (auf der äußeren Ebene der gespeicherten Prozedur), LANGUAGE, ISOLATION LEVEL, DATEFORMAT und DATEFIRST.

  • Deklarieren von Variablen als NULL oder NOT NULL. Wenn eine Variable als NOT NULL deklariert wird, muss die Deklaration über einen Initialisierer verfügen. Wenn eine Variable nicht als NOT NULL deklariert wird, ist ein Initialisierer optional.

  • WENN und WHILE

  • EINFÜGEN/AKTUALISIEREN/LÖSCHEN

    Unterabfragen werden nicht unterstützt. In der WHERE- oder HAVING-Klausel werden AND und BETWEEN unterstützt; OR, NOT und IN werden nicht unterstützt.

  • Speicheroptimierte Tabellentypen und Tabellenvariablen.

  • RÜCKGABE

  • AUSWÄHLEN

  • SET

  • TRY/CATCH/THROW

    Verwenden Sie zum Optimieren der Leistung einen einzelnen TRY/CATCH-Block für eine vollständig nativ kompilierte gespeicherte Prozedur.

Unterstützte Operatoren

Die folgenden Operatoren werden unterstützt.

  • Vergleichsoperatoren (Transact-SQL) (z. B. >, , = <>und <=) werden in Bedingten (WENN, WHILE) unterstützt.

  • Unäre Operatoren (+, -).

  • Binäre Operatoren (*, /, +, -, % (Modulo)).

    Der Plusoperator (+) wird sowohl für Zahlen als auch für Zeichenfolgen unterstützt.

  • Logische Operatoren (AND, OR, NOT). OR und NOT werden in IF- und WHILE-Anweisungen unterstützt, aber nicht in WHERE- oder HAVING-Klauseln.

  • Bitweise Operatoren ~, &, |und ^

Integrierte Funktionen in nativ kompilierten gespeicherten Prozeduren

Die folgenden Funktionen werden in Standardeinschränkungen für speicheroptimierte Tabellen und in nativ kompilierten gespeicherten Prozeduren unterstützt.

  • Mathematische Funktionen: ACOS, ASIN, ATAN, ATN2, COS, COT, GRAD, EXP, LOG, LOG10, PI, POWER, BOGENMAß, RAND, SIN, SQRT, SQUARE und TAN

  • Datumsfunktionen: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME und YEAR.

  • Zeichenfolgenfunktionen: LEN, LTRIM, RTRIM und SUBSTRING

  • Identitätsfunktion: SCOPE_IDENTITY

  • NULL-Funktionen: ISNULL

  • Funktionen für eindeutige Identifikatoren: NEWID und NEWSEQUENTIALID

  • Fehlerfunktionen: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY und ERROR_STATE

  • Konvertierungen: CAST und CONVERT. Konvertierungen zwischen Unicode- und Nicht-Unicode-Zeichenzeichenfolgen (n(var)char und (var)char) werden nicht unterstützt.

  • Systemfunktionen: @@rowcount. Anweisungen innerhalb nativ kompilierter gespeicherter Prozeduren aktualisieren @@rowcount, und Sie können @@rowcount in einer nativ kompilierten gespeicherten Prozedur verwenden, um die Zeilenanzahl zu bestimmen, die durch die letzte innerhalb dieser gespeicherten Prozedur ausgeführte Anweisung betroffen sind. @@rowcount wird jedoch am Anfang und am Ende der Ausführung einer nativ kompilierten gespeicherten Prozedur auf 0 zurückgesetzt.

Abfrageoberflächenbereich in nativ kompilierten gespeicherten Prozeduren

Folgendes wird unterstützt:

  • ZWISCHEN

  • Alias für Spaltennamen (mit entweder AS oder = Syntax).

  • CROSS JOIN und INNER JOIN werden nur mit SELECT-Abfragen unterstützt.

  • Ausdrücke werden in der SELECT-Liste und WHERE (Transact-SQL)-Klausel unterstützt, wenn sie einen unterstützten Operator verwenden. Die Liste der derzeit unterstützten Operatoren finden Sie unter "Unterstützte Operatoren ".

  • Filter-Prädikat IS [NOT] NULL

  • Aus speicheroptimierte Tabelle<>

  • GROUP BY (Transact-SQL) wird zusammen mit den Aggregatfunktionen AVG, COUNT, COUNT_BIG, MIN, MAX und SUMME unterstützt. MIN und MAX werden für die Typen nvarchar, char, varchar, varbinary und binary nicht unterstützt. ORDER BY-Klausel (Transact-SQL) wird mit GROUP BY (Transact-SQL) unterstützt, wenn ein Ausdruck in der LISTE ORDER BY in der LISTE GROUP BY verbatim angezeigt wird. Beispielsweise wird GROUP BY a + b ORDER BY a + b unterstützt, aber GROUP BY a, b ORDER BY a + b wird nicht unterstützt.

  • Die HAVING-Klausel unterliegt denselben Ausdruckseinschränkungen wie die WHERE-Klausel.

  • INSERT VALUES (eine Zeile pro Anweisung) und INSERT SELECT

  • BESTELLUNG NACH 1

  • Prädikate, die sich nicht auf eine Spalte beziehen.

  • SELECT, UPDATE und DELETE

  • TOP 1

  • Variable Zuordnung in der SELECT-Liste.

  • WO... UND

1 ORDER BY und TOP werden in nativ kompilierten gespeicherten Prozeduren mit einigen Einschränkungen unterstützt:

  • Es gibt keine Unterstützung für DISTINCT in der SELECT- oder ORDER BY-Klausel.

  • Es gibt keine Unterstützung für WITH TIES oder PERCENT in der TOP Klausel.

  • TOP kombiniert mit ORDER BY unterstützt nicht mehr als 8.192, wenn eine Konstante in der TOP-Klausel verwendet wird. Dieser Grenzwert kann verringert werden, wenn die Abfrage Verknüpfungen oder Aggregatfunktionen enthält. (Bei einer Verknüpfung (zwei Tabellen) beträgt der Grenzwert beispielsweise 4.096 Zeilen. Bei zwei Verknüpfungen (drei Tabellen) beträgt der Grenzwert 2.730 Zeilen.)

    Sie können Ergebnisse von mehr als 8.192 erhalten, indem Sie die Anzahl der Zeilen in einer Variablen speichern:

    DECLARE @v INT = 9000  
    SELECT TOP (@v) ... FROM ... ORDER BY ...  
    

Eine Konstante in der TOP Klausel führt jedoch zu einer besseren Leistung im Vergleich zur Verwendung einer Variablen.

Diese Einschränkungen gelten nicht für interpretierten Transact-SQL-Zugriff auf speicheroptimierte Tabellen.

Überwachung

Die Überwachung auf Prozedurebene wird in nativ kompilierten gespeicherten Prozeduren unterstützt. Überwachung auf Anweisungsebene wird nicht unterstützt.

Weitere Informationen zur Überwachung finden Sie unter Erstellen einer Serverüberwachungs- und Datenbanküberwachungsspezifikation.

Hinweise zu Tabellen, Abfragen und Verknüpfungen

Folgendes wird unterstützt:

  • INDEX-, FORCESCAN- und FORCESEEK-Hinweise, entweder in Tabellenhinweisssyntax oder in OPTION-Klausel (Transact-SQL) der Abfrage.

  • ERZWINGUNGSREIHENFOLGE

  • INNER-LOOP-Verknüpfung (INNER LOOP JOIN)

  • OPTIMIEREN FÜR

Weitere Informationen finden Sie unter Hints (Transact-SQL).

Einschränkungen bei der Sortierung

Sie können mehr als 8.000 Zeilen in einer Abfrage sortieren, die TOP (Transact-SQL) und eine ORDER BY-Klausel (Transact-SQL) verwendet. Ohne ORDER BY-Klausel (Transact-SQL) kann TOP (Transact-SQL) jedoch bis zu 8.000 Zeilen sortieren (weniger Zeilen, wenn Verknüpfungen vorhanden sind).

Wenn Ihre Abfrage sowohl den OPERATOR TOP (Transact-SQL) als auch eine ORDER BY-Klausel (Transact-SQL) verwendet, können Sie bis zu 8192 Zeilen für den TOP-Operator angeben. Wenn Sie mehr als 8192 Zeilen angeben, erhalten Sie die Fehlermeldung: Msg 41398, Level 16, State 1, Procedure procedureName<>, Line< lineNumber> Der TOP-Operator kann maximal 8192 Zeilen zurückgeben; <Die Nummer> wurde angefordert.

Wenn Sie keine TOP-Klausel haben, können Sie eine beliebige Anzahl von Zeilen mit ORDER BY sortieren.

Wenn Sie keine ORDER BY-Klausel verwenden, können Sie einen beliebigen ganzzahligen Wert mit dem TOP-Operator verwenden.

Beispiel mit TOP N = 8192: Kompiliert

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  

Beispiel mit TOP N > 8192: Fehler beim Kompilieren.

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  

Die Zeilenbeschränkung von 8192 gilt nur für TOP N, wenn N eine Konstante ist, wie in den vorherigen Beispielen. Wenn Sie mehr als 8192 benötigen N , können Sie den Wert einer Variablen zuweisen und diese Variable mit TOPverwenden.

Beispiel für eine Variable: Kompilieren

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  

Einschränkungen für zurückgegebene Zeilen: Es gibt zwei Fälle, in denen die Anzahl der Zeilen, die vom TOP-Operator zurückgegeben werden können, potenziell reduziert werden kann:

  • Verwenden von JOINs in der Abfrage. Der Einfluss von JOINs auf die Einschränkung hängt vom Abfrageplan ab.

  • Verwenden von Aggregatfunktionen oder Verweisen auf Aggregatfunktionen in der ORDER BY-Klausel.

Die Formel zum Berechnen eines Worst-Case-Maximums des unterstützten N im TOP-N-Szenario lautet: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Siehe auch

Nativ kompilierte gespeicherte Prozeduren
Migrationsprobleme für nativ kompilierte gespeicherte Prozeduren