Verhaltensänderungen von Datenbankmodul-Funktionen in SQL Server 2012

In diesem Thema werden Verhaltensänderungen in Database Engine (Datenbankmodul) beschrieben. Verhaltensänderungen beeinflussen das Funktionieren und Interagieren von Funktionen in SQL Server 2012 im Vergleich zu früheren Versionen von SQL Server.

Metadatenermittlung

Verbesserungen an Database Engine (Datenbankmodul) ab SQL Server 2012 ermöglichen es SQLDescribeCol, genauere Beschreibungen der erwarteten Ergebnisse abzurufen, als von SQLDescribeCol in früheren Versionen von SQL Server zurückgegeben wurden. Weitere Informationen finden Sie unter Metadatenermittlung.

Die SET FMTONLY-Option zum Bestimmen des Formats einer Antwort, ohne die Abfrage eigentlich auszuführen, wird durch sp_describe_first_result_set (Transact-SQL), sp_describe_undeclared_parameters (Transact-SQL), sys.dm_exec_describe_first_result_set (Transact-SQL) und sys.dm_exec_describe_first_result_set_for_object (Transact-SQL) ersetzt.

Änderungen am Verhalten bei der Skripterstellung eines SQL Server-Agent-Tasks

Wenn Sie in SQL Server 2012 einen neuen Auftrag erstellen, indem Sie das Skript aus einem bereits vorhandenen Auftrag kopieren, wird der vorhandene Auftrag möglicherweise versehentlich vom neuen Auftrag beeinflusst. Um einen neuen Auftrag mithilfe des Skripts aus einem vorhandenen Auftrag zu erstellen, löschen Sie den Parameter @schedule\_uid manuell. Dieser Parameter ist in der Regel der letzte Parameter in dem Abschnitt, in dem der Auftragszeitplan im vorhandenen Auftrag erstellt wird. Dadurch wird ein neuer und unabhängiger Zeitplan für den neuen Auftrag ohne Auswirkungen auf die vorhandenen Aufträge erstellt.

Reduktion konstanter Ausdrücke für benutzerdefinierte CLR-Funktionen und -Methoden

In SQL Server 2012 sind die benutzerdefinierten CLR-Objekte jetzt reduzierbar.

  • Benutzerdefinierte CLR-Funktionen mit deterministischen Skalarwerten.

  • Deterministische Methoden benutzerdefinierter CLR-Typen.

Diese Neuerung zielt auf die Verbesserung der Leistung ab, wenn diese Funktionen oder Methoden mehr als einmal mit den gleichen Argumenten aufgerufen werden. Diese Änderung verursacht jedoch möglicherweise unerwartete Ergebnisse, wenn nichtdeterministische Funktionen oder Methoden fehlerhaft als deterministisch markiert wurden. Der Determinismus einer CLR-Funktion oder Methode wird vom Wert der IsDeterministic-Eigenschaft vom SqlFunctionAttribute oder SqlMethodAttribute angegeben.

Verhalten der STEnvelope()-Methode wurde mit leeren räumlichen Typen geändert

Das Verhalten der STEnvelope-Methode mit leeren Objekten ist jetzt mit dem Verhalten anderer räumlicher SQL Server-Methoden konsistent.

In SQL Server 2008 hat die STEnvelope-Methode die folgenden Ergebnisse zurückgegeben, wenn sie mit leeren Objekten aufgerufen wurde:

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns POINT EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns LINESTRING EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns POLYGON EMPTY

In SQL Server 2012 gibt die STEnvelope-Methode nun die folgenden Ergebnisse zurück, wenn sie mit leeren Objekten aufgerufen wird:

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY

Um zu bestimmen, ob ein räumliches Objekt leer ist, rufen Sie die STIsEmpty (geometry-Datentyp)-Methode auf.

LOG-Funktion verfügt über neue optionale Parameter

Die LOG-Funktion verfügt jetzt über einen optionalen base-Parameter. Weitere Informationen finden Sie unter LOG (Transact-SQL).

Das Berechnen von Statistiken hat sich während der Vorgänge für partitionierte Indizes geändert

In SQL Server 2012 werden Statistiken nicht durch das Scannen aller Zeilen in der Tabelle erstellt, wenn ein partitionierter Index erstellt oder neu erstellt wird. Der Abfrageoptimierer generiert stattdessen Statistiken mithilfe des Standardalgorithmus zur Stichprobenentnahme. Nachdem eine Datenbank mit partitionierten Indizes aktualisiert wurde, bemerken Sie möglicherweise einen Unterschied in den Histogrammdaten für diese Indizes. Diese Änderung des Verhaltens beeinträchtigt die Abfrageleistung möglicherweise nicht. Um Statistiken zu partitionierten Indizes durch das Scannen aller Zeilen in der Tabelle abzurufen, verwenden Sie CREATE STATISTICS oder UPDATE STATISTICS mit der FULLSCAN-Klausel.

Die Datentypkonvertierung durch die XML-Wert Methode hat sich geändert

Das interne Verhalten der value-Methode des xml-Datentyps hat sich geändert. Diese Methode führt für das XML-Element eine XQuery aus und gibt einen Skalarwert des angegebenen SQL Server-Datentyps zurück. Der xs-Typ muss in den SQL Server-Datentyp umgewandelt werden. Früher hat die value-Methode den Quellwert intern in eine xs:-Zeichenfolge konvertiert und dann die xs:-Zeichenfolge in den SQL Server-Datentyp konvertiert. In SQL Server 2012 wird die Konvertierung in die xs:-Zeichenfolge in den folgenden Fällen übersprungen:

Quell-XS-Datentyp

Ziel-SQL Server-Datentyp

byte

short

int

integer

long

unsignedByte

unsignedShort

unsignedInt

unsignedLong

positiveInteger

nonPositiveInteger

negativeInteger

nonNegativeInteger

tinyint

smallint

int

bigint

decimal

numeric

decimal

decimal

numeric

float

real

double

float

Das neue Verhalten verbessert die Leistung, wenn die Zwischenkonvertierung übersprungen werden kann. Wenn bei Datentypkonvertierungen jedoch Fehler auftreten, werden andere Fehlermeldungen angezeigt, als dies beim Konvertieren vom dazwischenliegenden xs:-Zeichenfolgen-Wert der Fall wäre. Wenn die Wertmethode beispielsweise den int-Wert "100000" nicht in einen smallint konvertiert hat, lautete die vorherige Fehlermeldung:

The conversion of the nvarchar value '100000' overflowed an INT2 column. Use a larger integer column.

In SQL Server 2012 lautet die Fehlermeldung (ohne die Zwischenkonvertierung in die xs:-Zeichenfolge):

Arithmetic overflow error converting expression to data type smallint.

sqlcmd.exe-Verhaltensänderung im XML-Modus

Es treten Verhaltensänderungen auf, wenn Sie "sqlcmd.exe" beim Ausführen von "SELECT * from T FOR XML …." im XML-Modus verwenden (Befehl ": XML ON"). Weitere Informationen finden Sie unter Erweiterungen der Verwaltbarkeit (Datenbankmodul).

Meldung "DBCC CHECKIDENT Revised" (DBCC CHECKIDENT überarbeitet)

In SQL Server 2012 wurde die vom DBCC CHECKIDENT-Befehl zurückgegebene Meldung nur geändert, wenn es mit RESEED new_reseed_value verwendet wird, um den aktuellen Identitätswert zu ändern. Die neue Meldung lautet: "Überprüfen der Identitätsinformationen: Aktueller Identitätswert'<, aktueller Identitätswert>'". Die DBCC-Ausführung wurde abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben hat, wenden Sie sich an den Systemadministrator."

In früheren Versionen lautete die Meldung: "Überprüfen der Identitätsinformationen: Aktueller Identitätswert '<Aktueller Identitätswert>', Aktueller Spaltenwert '<Aktueller Spaltenwert>'". Die DBCC-Ausführung wurde abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben hat, wenden Sie sich an den Systemadministrator." Die Meldung wird nicht verändert, wenn DBCC CHECKIDENT mit NORESEED ohne zweiten Parameter oder ohne einen reseed-Wert angegeben wird. Weitere Informationen finden Sie unter DBCC CHECKIDENT (Transact-SQL).

Verhalten der exist()-Funktion auf dem XML-Datentyp hat sich geändert

Beim Vergleichen eines XML-Datentyps mit einem NULL-Wert zu 0 (null) hat sich das Verhalten der exist()-Funktion geändert. Betrachten Sie das folgende Beispiel:

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 0;

In früheren Versionen wurde bei diesem Vergleich "1" (true) zurückgegeben, jetzt wird stattdessen "0" (null, false) zurückgegeben.

Die folgenden Vergleiche haben sich nicht geändert:

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 1; -- 0 expected, 0 returned
SELECT COUNT(1) WHERE @test.exist('/dogs') IS NULL; -- 1 expected, 1 returned

Siehe auch

Verweis

Fehlerhafte Änderungen an Funktionen des Datenbankmoduls in SQL Server 2012

Als veraltet markierte Funktionen des Datenbankmoduls in SQL Server 2012

Nicht mehr unterstützte Datenbankmodul-Funktionalität in SQL Server 2012

ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL)