Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Thema enthält eine Liste der unterstützten Features für nativ kompilierte gespeicherte Prozeduren (CREATE PROCEDURE (Transact-SQL)):
Programmierbarkeit in systemintern kompilierten gespeicherten Prozeduren
Integrierte Funktionen in systemintern kompilierten gespeicherten Prozeduren
Abfrageoberfläche in systemintern kompilierten gespeicherten Prozeduren
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 oderSELECT
-Klausel bietet keine Unterstützung fürORDER BY
.Die
WITH TIES
-Klausel bietet keine Unterstützung fürPERCENT
oderTOP
.TOP
in Kombination mitORDER BY
unterstützt höchstens den Wert 8.192 bei Verwendung einer Konstante in derTOP
-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 TOP
verwenden.
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