Freigeben über


Unterstützte Konstrukte in systemintern 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 systemintern kompilierten gespeicherten Prozeduren unterstützt werden, finden Sie unter Supported Data Types.

Vollständige Informationen zu nicht unterstützten Konstrukten sowie Informationen zu Umgehungslösungen zu einigen der nicht unterstützten Funktionen in systemintern kompilierten gespeicherten Prozeduren finden Sie unter Migration Issues for Natively Compiled Stored Procedures. Weitere Informationen zu nicht unterstützten Funktionen finden Sie unter Von In-Memory-OLTP nicht unterstützte Transact-SQL-Konstrukte.

Programmierbarkeit in systemintern kompilierten gespeicherten Prozeduren

Folgende werden 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 einen Initialisierer haben. Wenn eine Variable nicht als NOT NULL deklariert wird, ist ein Initialisierer optional.

  • IF und WHILE

  • INSERT/UPDATE/DELETE

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

  • Speicheroptimierte Tabellentypen und Tabellenvariablen.

  • RETURN

  • SELECT

  • SET

  • TRY/CATCH/THROW

    Um die Leistung zu verbessern, können Sie einen einzelnen TRY/CATCH-Block für eine gesamte systemintern kompilierte gespeicherte Prozedur verwenden.

Unterstützte Operatoren

Die folgenden Operatoren werden unterstützt.

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

  • Unäre Operatoren (+, -)

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

    Der Plusoperator (+) wird in Zahlen und Zeichenfolgen unterstützt.

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

  • Bitweise Operatoren ~, &, |, und ^

Integrierte Funktionen in systemintern kompilierten gespeicherten Prozeduren

Die folgenden Funktionen werden in Standardeinschränkungen in speicheroptimierten Tabellen und in systemintern kompilierten gespeicherte Prozeduren unterstützt.

  • Mathematische Funktionen: ARCCOS, ARCSIN, ARCTAN, ATN2, COS, COT, GRAD, EXP, LOG, LOG10, PI, POTENZ, BOGENMASS, ZUFALLSZAHL, SIN, WURZEL, QUADRAT 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ätsfunktionen: SCOPE_IDENTITY

  • NULL-Funktionen: ISNULL

  • Uniqueidentifier-Funktionen: 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-Zeichenfolgen (n(var)char und (var)char) werden nicht unterstützt.

  • Systemfunktionen: @@rowcount. Durch Anweisungen in systemintern kompilierten gespeicherten Prozeduren wird @@rowcount aktualisiert, und Sie können @@rowcount in einer systemintern kompilierten gespeicherten Prozedur verwenden, um die Anzahl der Zeilen zu bestimmen, die von der letzten Anweisung betroffen sind, die innerhalb der systemintern kompilierten gespeicherten Prozedur ausgeführt wurde. Allerdings wird @@rowcount am Anfang und am Ende der Ausführung einer systemintern kompilierten gespeicherten Prozedur auf 0 zurückgesetzt.

Abfrageoberfläche in systemintern kompilierten gespeicherten Prozeduren

Folgende werden unterstützt:

  • BETWEEN

  • Aliase für Spaltennamen (entweder mithilfe von AS oder = Syntax)

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

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

  • Filterprädikat IS [NOT] NULL

  • FROM-speicheroptimierte <Tabelle>

  • GROUP BY (Transact-SQL) wird zusammen mit den Aggregatfunktionen AVG, COUNT, COUNT_BIG, MIN, MAX und SUM unterstützt. MIN und MAX werden für die Typen nvarchar, char, varchar, varchar, vabinary 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 wörtlich in der Liste GROUP BY angezeigt wird. Beispielsweise wird GROUP BY a + b ORDER BY a + b unterstützt, aber GROUP BY a, b ORDER BY a + b nicht.

  • HAVING unterliegt den gleichen Ausdruckseinschränkungen wie die WHERE-Klausel.

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

  • BESTELLUNG NACH 1

  • Prädikate, die nicht auf eine Spalte verweisen.

  • SELECT, UPDATE und DELETE

  • TOP 1

  • Variablenzuweisung in der SELECT-Liste

  • WO... UND

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

  • Die DISTINCT-Klausel oder SELECT-Klausel bietet keine Unterstützung für ORDER BY.

  • Die WITH TIES-Klausel bietet keine Unterstützung für PERCENT oder TOP.

  • TOP in Kombination mit ORDER BY unterstützt höchstens den Wert 8.192 bei Verwendung einer Konstante in der TOP-Klausel. Dieser Grenzwert kann herabgesetzt werden, wenn die Abfrage Joins oder Aggregatfunktionen enthält. (Beispielsweise liegt die Beschränkung bei einem Join mit zwei Tabellen bei 4.096 Zeilen. Bei zwei Joins mit drei Tabellen lautet der Grenzwert 2.730 Zeilen).

    Sie können Ergebnisse erhalten, die größer als 8.192 sind, indem Sie die Anzahl von Zeilen in einer Variablen speichern:

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

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

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

Überwachung

Überwachung auf Prozedurebene wird für systemintern kompilierte gespeicherte Prozeduren unterstützt. Überwachung auf Anweisungsebene wird nicht unterstützt.

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

Tabelle, Abfrage und Joinhinweise

Folgende werden unterstützt:

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

  • FORCE ORDER

  • INNER LOOP JOIN

  • OPTIMIZE FOR

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 Joins vorhanden sind).

Wenn Ihre Abfrage sowohl den TOP-Operator (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; <Nummer> wurde angefordert.

Wenn keine TOP-Klausel vorhanden ist, kann eine beliebige Anzahl von Zeilen mit ORDER BY sortiert werden.

Wenn keine ORDER BY-Klausel verwendet wird, können Sie jeden ganzzahligen Wert mit dem TOP-Operator verwenden.

Beispiel mit TOP N = 8192: Wird 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 Einschränkung auf 8192 Zeilen gilt nur für TOP N , wobei N wie in den Beispielen oben eine Konstante ist. Wenn N größer als 8192 sein muss, können Sie den Wert einer Variablen zuweisen und die Variable mit TOPverwenden.

Beispiel mit einer Variablen: Wird kompiliert

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 die zurückgegebenen Zeilen: Es gibt zwei Fälle, in denen die Anzahl von Zeilen, die vom TOP-Operator zurückgegeben werden kann, verringert wird:

  • Verwenden von JOINs in der Abfrage Die Auswirkungen von JOINs auf die Einschränkung sind vom Abfrageplan abhängig.

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

Die Formel zum Berechnen eines im ungünstigsten Fall unterstützten Maximalwerts für N in TOP N lautet wie folgt: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Weitere Informationen

Nativ kompilierte gespeicherte Prozeduren
Migrationsprobleme bei nativ kompilierten gespeicherten Prozeduren