Differenze di funzionamento delle funzionalità del Motore di database in SQL Server 2014

In questo argomento vengono descritte le modifiche al comportamento nel motore di database. Le modifiche al comportamento influiscono sul funzionamento o l'interazione delle funzionalità in SQL Server 2014 rispetto alle versioni precedenti di SQL Server.

Modifiche al comportamento in SQL Server 2014

Nelle versioni precedenti di SQL Server, le query su un documento XML contenente stringhe su una determinata lunghezza (più di 4020 caratteri) possono restituire risultati non corretti. In SQL Server 2014, tali query restituiscono i risultati corretti.

Modifiche di funzionamento apportate in SQL Server 2012

Individuazione dei metadati

Miglioramenti nel motore di database a partire da SQL Server 2012 consentono a SQLDescribeCol di ottenere descrizioni più accurate dei risultati previsti rispetto a quelli restituiti da SQLDescribeCol nelle versioni precedenti di SQL Server. Per altre informazioni, vedere Metadata Discovery.

L'opzione SET FMTONLY per determinare il formato di una risposta senza eseguire effettivamente la query viene sostituita con sp_describe_first_result_set (Transact-SQL), sp_describe_undeclared_parameters (Transact-SQL), sys.dm_exec_describe_first_result_set (Transact-SQL) e sys.dm_exec_describe_first_result_set_for_object (Transact-SQL).

Modifiche al comportamento di script di un'attività di SQL Server Agent

A partire da SQL Server 2012, se si crea un nuovo processo copiando lo script da un processo esistente, il nuovo processo potrebbe influire inavvertitamente sul processo esistente. Per creare un nuovo processo utilizzando lo script di uno esistente, eliminare manualmente il parametro @schedule_uid che in genere è l'ultimo parametro della sezione tramite cui viene creata la pianificazione del processo in quello esistente. Verrà creata una nuova pianificazione indipendente per il nuovo processo senza influire sui processi esistenti.

Elaborazione delle costanti in fase di compilazione per funzioni e metodi CLR definiti dall'utente

A partire da SQL Server 2012, gli oggetti CLR definiti dall'utente seguenti sono ora piegabili:

  • Funzioni CLR definite dall'utente con valori scalari deterministici.
  • Metodi deterministici di tipi CLR definiti dall'utente.

Con questo miglioramento si cerca di ottimizzare le prestazioni quando questi metodi o funzioni vengono chiamati più di una volta con gli stessi argomenti. Tuttavia, questa modifica potrebbe provocare risultati imprevisti quando funzioni o metodi non deterministici sono stati contrassegnati erroneamente come deterministici. Il determinismo di una funzione o di un metodo CLR viene indicato dal valore della proprietà IsDeterministic di SqlFunctionAttribute o SqlMethodAttribute.

Modifica del comportamento del metodo STEnvelope() con i tipi spaziali vuoti

Il comportamento del metodo con oggetti vuoti è ora coerente con il STEnvelope comportamento di altri metodi spaziali SQL Server.

In SQL Server 2008 il STEnvelope metodo ha restituito i risultati seguenti quando viene chiamato con oggetti vuoti:

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 il STEnvelope metodo restituisce ora i risultati seguenti quando viene chiamato con oggetti vuoti:

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  

Per determinare se un oggetto spaziale è vuoto, chiamare il metodo STIsEmpty (geometry Data Type).

Nuovo parametro facoltativo della funzione LOG

La LOG funzione ha ora un parametro di base facoltativo. Per altre informazioni, vedere LOG (Transact-SQL) .

Modifica del calcolo delle statistiche durante operazioni su indici partizionati

In SQL Server 2014 le statistiche non vengono create analizzando tutte le righe della tabella quando viene creato o ricompilato un indice partizionato. Query Optimizer usa invece l'algoritmo di campionamento predefinito per generare statistiche. Dopo avere aggiornato un database con gli indici partizionati, è possibile notare una differenza nei dati dell'istogramma relativamente a tali indici. Tale cambiamento potrebbe non influire sulle prestazioni di query. Per ottenere statistiche sugli indici partizionati analizzando tutte le righe nella tabella, usare CREATE STATISTICS o UPDATE STATISTICS con la clausola FULLSCAN.

Modifica della conversione del tipo di dati mediante il metodo relativo al valore XML

Il comportamento interno del metodo value del tipo di dati xml è cambiato. Questo metodo esegue una XQuery sul codice XML e restituisce un valore scalare del tipo di dati SQL Server specificato. Il tipo xs deve essere convertito nel tipo di dati SQL Server. In precedenza, il value metodo converte internamente il valore di origine in una stringa xs:string, quindi converte il tipo di dati xs:string nel tipo di dati SQL Server. In SQL Server 2014 la conversione in xs:string viene ignorata nei casi seguenti:

Tipo di dati XS di origine Tipo di dati di SQL Server di destinazione
byte

short

INT

numero intero

long

unsignedByte

unsignedShort

unsignedInt

unsignedLong

positiveInteger

nonPositiveInteger

negativeInteger

nonNegativeInteger
TINYINT

smallint

int

bigint

decimal

NUMERIC
decimal decimal

NUMERIC
float real
double float

Con il nuovo comportamento è possibile migliorare le prestazioni quando la conversione intermedia può essere ignorata. Tuttavia, quando le conversioni del tipo di dati non vengono completate correttamente, vengono visualizzati messaggi di errore diversi rispetto a quelli generati in caso di conversione dal valore xs:string intermedio. Ad esempio, se tramite il metodo value non era stato possibile convertire il valore int 100000 in smallint, il messaggio di errore precedente era:

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

In SQL Server 2014, senza la conversione intermedia in xs:string, il messaggio di errore è:

Arithmetic overflow error converting expression to data type smallint.

Modifica del comportamento del file sqlcmd.exe in modalità XML

Esistono modifiche al comportamento se si usa sqlcmd.exe con la modalità XML (comando:XML ON) durante l'esecuzione di un oggetto SELECT * da T FOR XML ....

Revisione del messaggio restituito da DBCC CHECKIDENT

In SQL Server 2012 il messaggio restituito dal comando DBCC CHECKIDENT è cambiato solo quando viene usato con reseED new_reseed_value per modificare il valore di identità corrente. Il nuovo messaggio è "Verifica delle informazioni sull'identità: valore di identità corrente "<valore> di identità corrente". Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema".

Nelle versioni precedenti il messaggio è "Verifica delle informazioni sull'identità: valore di identità corrente", valore di colonna corrente '<><valore> di colonna corrente'. Esecuzione DBCC completata. Se DBCC ha stampato messaggi di errore, contattare l'amministratore del sistema." Il messaggio viene invariato quando DBCC CHECKIDENT viene specificato con NORESEED, senza un secondo parametro o senza un valore restituito. Per altre informazioni, vedere DBCC CHECKIDENT (Transact-SQL).

Modifica del comportamento della funzione exist() nel tipo di dati di XML

Il comportamento della exist() funzione è cambiato quando si confronta un tipo di dati XML con un valore Null a 0 (zero). Prendere in considerazione gli esempi seguenti:

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

Nelle versioni precedenti tramite questo confronto veniva restituito 1 (true), mentre ora viene restituito 0 (zero, false).

I confronti riportati di seguito non sono cambiati:

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  

Vedere anche

Modifiche di rilievo apportate alle funzionalità del motore di database in SQL Server 2014
Funzionalità del Motore di database deprecate in SQL Server 2014
Funzionalità del Motore di database non più utilizzate in SQL Server 2014
Livello di compatibilità ALTER DATABASE (Transact-SQL)