Condividi tramite


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

In questo argomento vengono descritte le modifiche di comportamento introdotte nel Motore di database. Queste modifiche influiscono sulle modalità di utilizzo o di interazione delle funzionalità in SQL Server 2012 rispetto alle versioni precedenti di SQL Server.

Individuazione dei metadati

I miglioramenti apportati al Motore di database a partire da SQL Server 2012 consentono a SQLDescribeCol di ottenere descrizioni più accurate dei risultati previsti rispetto a quelle restituite da SQLDescribeCol nelle versioni precedenti di SQL Server. Per ulteriori informazioni, vedere Individuazione dei metadati.

L'opzione SET FMTONLY per la determinazione del formato di una risposta senza eseguire realmente 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

In SQL Server 2012 se si crea un nuovo processo copiando lo script da un processo esistente, il nuovo potrebbe inavvertitamente influire su quello 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

In SQL Server 2012 è ora possibile eseguire l'elaborazione delle costanti in fase di compilazione per i seguenti oggetti CLR definiti dall'utente:

  • 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 STEnvelope con gli oggetti vuoti è ora coerente con il comportamento degli altri metodi spaziali di SQL Server.

In SQL Server 2008, in caso di chiamata del metodo STEnvelope con oggetti vuoti, venivano restituiti i risultati seguenti:

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, in caso di chiamata del metodo STEnvelope con oggetti vuoti, vengono ora restituiti i risultati seguenti:

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 (tipo di dati geometry).

Nuovo parametro facoltativo della funzione LOG

Per la funzione LOG è ora disponibile un parametro base facoltativo. Per ulteriori informazioni, vedere LOG (Transact-SQL).

Modifica del calcolo delle statistiche durante operazioni su indici partizionati

In SQL Server 2012 le statistiche non vengono create analizzando tutte le righe nella tabella se viene creato o ricompilato un indice partizionato. Query Optimizer utilizza 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, utilizzare 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. Con questo metodo è possibile eseguire un'espressione XQuery sul codice XML ottenendo un valore scalare del tipo di dati specificato di SQL Server. Il tipo xs deve essere convertito nel tipo di dati di SQL Server. In precedenza, con il metodo value era possibile convertire internamente il valore di origine in xs:string e, successivamente, convertire xs:string nel tipo di dati di SQL Server. In SQL Server 2012 la conversione a xs:string viene ignorata nei casi seguenti:

Tipo di dati XS di origine

Tipo di dati di SQL Server di destinazione

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

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 2012, senza la conversione intermedia a 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

Se si utilizza sqlcmd.exe con modalità XML (comando :XML ON) quando si esegue un'istruzione SELECT da T FOR XML …., sono previste modifiche del comportamento. Per ulteriori informazioni, vedere Miglioramenti apportati alla facilità di gestione (Motore di database).

Revisione del messaggio restituito da DBCC CHECKIDENT

In SQL Server 2012 il messaggio restituito dal comando DBCC CHECKIDENT è cambiato solo se utilizzato con RESEED new_reseed_value per modificare il valore Identity corrente. Il nuovo messaggio è "Controllo delle informazioni Identity: valore Identity corrente '<valore Identity corrente>'. Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema".

Nelle versioni precedenti il messaggio era "Controllo delle informazioni Identity: valore Identity corrente '<valore Identity corrente>', valore di colonna corrente '<valore di colonna corrente>'. Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema". Il messaggio è invariato quando DBCC CHECKIDENT viene specificato con NORESEED, senza un secondo parametro o senza il valore reseed. Per ulteriori informazioni, vedere DBCC CHECKIDENT (Transact-SQL).

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

Il comportamento della funzione exist() è cambiato se si confronta un tipo di dati XML con un valore Null a 0 (zero). Si consideri l'esempio descritto di seguito.

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

Riferimento

Modifiche che possono causare problemi di funzionamento apportate alle funzionalità del Motore di database in SQL Server 2012.

Funzionalità del Motore di database deprecate in SQL Server 2012

Funzionalità del Motore di database non più utilizzate in SQL Server 2012

Livello di compatibilità ALTER DATABASE (Transact-SQL)