Unterstützte Konstrukte in systemintern kompilierten gespeicherten Prozeduren

 

Veröffentlicht: November 2016

Dieses Thema enthält eine Liste der unterstützten Funktionen für systemintern 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.

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.

Die folgenden Operatoren werden unterstützt.

  • Vergleichsoperatoren ( Transact-SQL ) (beispielsweise >, <>, =, und < =) werden in Bedingungen unterstützt (IF, WÄHREND).

  • 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 ^

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. Anweisungen innerhalb von systemintern kompilierten gespeicherten Prozeduren Update @@rowcount und können @@rowcount in einer systemintern kompilierten gespeicherten Prozedur bestimmen die Anzahl der Zeilen, die von der letzten betroffenen Anweisung innerhalb der systemintern kompilierte gespeicherte Prozedur. Allerdings @@rowcount wird am Anfang und am Ende der Ausführung einer systemintern kompilierten gespeicherten Prozedur auf 0 zurückgesetzt.

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 SELECT-Liste unterstützt und auf DEM ( Transact-SQL ) -Klausel, wenn sie einen unterstützten Operatoren verwenden. Unter Unterstützte Operatoren finden Sie eine Liste der zurzeit unterstützten Operatoren.

  • Filterprädikat IS [NOT] NULL

  • AUS < Speicheroptimierte Tabelle>

  • GROUP BY ( Transact-SQL ) wird zusammen mit der 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 unterstützt, wobei GROUP BY ( Transact-SQL ) Wenn Sie ein Ausdruck in der ORDER BY-Liste wörtlich in der GROUP BY-Liste 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

  • ORDER BY 1

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

  • SELECT, UPDATE und DELETE

  • TOP 1

  • Variablenzuweisung in der SELECT-Liste

  • WHERE... AND

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

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

  • 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 den interpretierten Transact-SQL -Zugriff auf speicheroptimierte Tabellen.

Ü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 Create a Server Audit and Database Audit Specification.

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 Tabellenhinweise ( Transact-SQL ).

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 die ORDER BY-Klausel (Transact-SQL) kann TOP (Transact-SQL) eine Sortierung von bis zu 8.000 Zeilen durchführen (weniger Zeilen, falls es Verknüpfungen gibt).

Wenn die Abfrage jeweils den Operator TOP (Transact-SQL) und 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, wird die Fehlermeldung angezeigt: Msg 41398, Level 16, State 1, Procedure >, Line > Der Operator TOP kann maximal 8192 Zeilen zurückgeben; > 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: Kann nicht kompiliert werden

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 zurückgegebene Zeilen: Es gibt zwei Fälle, in denen sich die Anzahl der Zeilen, die vom TOP-Operator zurückgegeben werden können, u. U. verringert:

  • 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 ).

Systemintern kompilierte gespeicherte Prozeduren
Migrationsprobleme bei systemintern kompilierten gespeicherten Prozeduren

Anzeigen: