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)