sp_dbcmptlevel (Transact-SQL)
Data aggiornamento: 17 luglio 2006
Imposta aspetti specifici del funzionamento del database in modo che risultino compatibili con la versione precedente di SQL Server.
Convenzioni della sintassi Transact-SQL
Sintassi
sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]
Argomenti
- [ @dbname= ] name
Nome del database di cui si desidera modificare il livello di compatibilità. I nomi di database devono essere conformi alle regole per gli identificatori. name è di tipo sysname e il valore predefinito è NULL.
[ @new_cmptlevel= ] version
Versione di SQL Server con cui il database deve risultare compatibile. version è di tipo tinyint e il valore predefinito è NULL. Il valore deve essere uno dei seguenti:60 = SQL Server 6.0
65 = SQL Server 6.5
70 = SQL Server 7.0
80 = SQL Server 2000
90 = SQL Server 2005
[!NOTA] I valori 60 e 65 sono obsoleti e verranno rimossi in una versione futura.
Attenzione: SQL Server Management Studio e SQL Server Management Objects (SMO) non supportano il livello di compatibilità 60. Se si utilizza SMO o Management Studio con un database per cui è impostato il livello di compatibilità 60, verranno generati errori per alcune operazioni.
Set di risultati
Se non si specifica alcun parametro oppure si omette il parametro name, la stored procedure sp_dbcmptlevel restituisce un errore.
Se si specifica name senza specificare version, il Motore di database di SQL Server 2005 restituisce un messaggio in cui viene visualizzato il livello di compatibilità corrente del database specificato.
Osservazioni
Per tutte le installazioni di SQL Server 2005, il livello di compatibilità predefinito è 90. I database creati in SQL Server 2005 sono impostati su questo livello a meno che il database model non abbia un livello di compatibilità inferiore. Quando si aggiorna un database a SQL Server 2005 da qualsiasi versione precedente di SQL Server, il database mantiene il livello di compatibilità esistente. Questo comportamento si applica sia ai database di sistema, sia ai database utente. Per impostare il livello di compatibilità del database su 90, utilizzare sp_dbcmptlevel. Per visualizzare il livello di compatibilità corrente di un database, eseguire una query sulla colonna compatibility_level nella vista del catalogo sys.databases.
Utilizzo di sp_dbcmptlevel per compatibilità con le versioni precedenti
La stored procedure sp_dbcmptlevel influisce solo sul funzionamento del database specificato e non sull'intero server. Con la stored procedure sp_dbcmptlevel si ottiene esclusivamente una compatibilità parziale con le versioni precedenti di SQL Server. Utilizzare sp_dbcmptlevel come strumento di migrazione provvisoria per risolvere i problemi correlati alle differenze tra le versioni delle funzioni controllate dall'impostazione del livello di compatibilità appropriato. In presenza di applicazioni esistenti di SQL Server interessate dalle differenze funzionali introdotte in SQL Server 2005, convertire l'applicazione per ottenere il funzionamento corretto, Quindi utilizzare sp_dbcmptlevel per impostare il livello di compatibilità su 90. La nuova impostazione del livello di compatibilità per un database diventa effettiva la successiva volta che il database diventa corrente, sia come database predefinito all'accesso o perché specificato in un'istruzione USE.
Per un database contenente una vista indicizzata non è possibile modificare il livello di compatibilità impostando un livello inferiore a 80.
Procedure consigliate
Se si modifica il livello di compatibilità mentre gli utenti sono connessi al database, è possibile che venga restituito un set di risultati non corretti per le query attive. Ad esempio, se si modifica il livello di compatibilità durante la compilazione di un piano di query, è possibile che il piano compilato sia basato sui livelli di compatibilità sia vecchi che nuovi, con conseguente restituzione di un piano non corretto e di risultati potenzialmente non accurati. Il problema potrebbe essere inoltre aggravato dal fatto che il piano venga inserito nella cache dei piani e riutilizzato per query successive. Per evitare risultati di query non accurati, è consigliabile utilizzare la procedura seguente per modificare il livello di compatibilità di un database:
- Impostare il database in modalità di accesso utente singolo utilizzando ALTER DATABASE SET SINGLE_USER.
- Modificare il livello di compatibilità del database.
- Impostare il database in modalità di accesso multiutente utilizzando ALTER DATABASE SET MULTI_USER.
- Per ulteriori informazioni sull'impostazione della modalità di accesso di un database, vedere ALTER DATABASE (Transact-SQL).
Opzioni SET
Le nuove funzionalità possono funzionare con livelli di compatibilità meno recenti ma è necessario regolare le opzioni SET. Ad esempio, l'utilizzo del tipo di dati xml con livello di compatibilità 80 richiede l'impostazione delle opzioni SET ANSI appropriate. Quando il livello di compatibilità del database viene impostato su 90, l'impostazione di ANSI_WARNINGS su ON comporta inoltre l'impostazione implicita di ARITHABORT su ON. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata esplicitamente su ON. Per ulteriori informazioni, vedere Opzioni SET che hanno effetto sui risultati.
Livelli di compatibilità e stored procedure
Durante l'esecuzione di una una stored procedure, viene utilizzato il livello di compatibilità corrente del database in cui la stored procedure è definita. Se si modifica l'impostazione di compatibilità di un database, tutte le relative stored procedure vengono ricompilate automaticamente per riflettere tale modifica.
Considerazioni sull'utilizzo di sp_dbcmptlevel
Ogni chiamata di sp_dbcmptlevel deve essere eseguita singolarmente. Non è possibile chiamare sp_dbcmptlevel da altri contesti, come i seguenti:
- Una stored procedure.
- Una stringa Transact-SQL eseguita con la sintassi EXEC(string).
- Batch di istruzioni Transact-SQL.
Differenze tra il livello 60 o 65 e il livello 70, 80 o 90
L'impostazione di un livello di compatibilità 60 o 65 influisce su numerose funzionalità, tra le quali quelle indicate nella colonna sinistra della tabella seguente.
[!NOTA] Per ulteriori informazioni sulle differenze relative alle applicazioni 6.x, vedere "Differenze tra i livelli di compatibilità inferiori e il livello 90" di seguito in questo argomento e le parole chiave riservate nei livelli successivi al 6.x nella sezione "Osservazioni".
Livello di compatibilità 60 o 65
Livello di compatibilità 70 o superiore
I set dei risultati delle istruzioni SELECT con la clausola GROUP BY e senza clausola ORDER BY vengono ordinati dalle colonne GROUP BY.
La sola clausola GROUP BY non consente di applicare l'ordinamento. Per ordinare qualsiasi set dei risultati, è necessario specificare in modo esplicito la clausola ORDER BY per SQL Server. Per ulteriori informazioni, vedere SELECT (Transact-SQL).
Nella clausola SET di un'istruzione UPDATE sono consentite colonne precedute da alias di tabella.
Gli alias di tabella non sono consentiti nella clausola SET di un'istruzione UPDATE. La tabella o la vista specificata nella clausola SET deve corrispondere a quella specificata immediatamente dopo la parola chiave UPDATE. Per ulteriori informazioni, vedere UPDATE (Transact-SQL).
Le colonne di tipo bit create senza un'opzione NULL o NOT NULL esplicita in CREATE TABLE o ALTER TABLE vengono create come NOT NULL.
Il supporto dei valori Null delle colonne bit, nel caso in cui tale supporto non sia impostato in modo esplicito, viene determinato tramite l'impostazione di sessione di SET ANSI_NULL_DFLT_ON o SET ANSI_NULL_DFLT_OFF oppure tramite l'impostazione di database di SET ANSI NULL DEFAULT. Per ulteriori informazioni, vedere SET (Transact-SQL).
Non è possibile utilizzare la clausola ALTER COLUMN in ALTER TABLE.
È possibile utilizzare la clausola ALTER COLUMN in ALTER TABLE. Per ulteriori informazioni, vedere ALTER TABLE (Transact-SQL).
Un trigger creato per una tabella sostituisce tutti gli eventuali trigger esistenti dello stesso tipo (INSERT, UPDATE, DELETE). È possibile utilizzare l'opzione WITH APPEND di CREATE TRIGGER per creare più trigger dello stesso tipo.
I trigger dello stesso tipo vengono accodati a quelli esistenti. I nomi dei trigger devono essere univoci. L'opzione WITH APPEND viene utilizzata per impostazione predefinita. Per ulteriori informazioni, vedere CREATE TRIGGER (Transact-SQL).
Se un batch o una procedura contiene nomi di oggetti non validi, viene restituito un avviso in fase di analisi o compilazione del batch e un messaggio di errore durante l'esecuzione del batch.
Per gli oggetti locali non validi, non viene restituito alcun avviso in fase di analisi o compilazione del batch e nessun messaggio di errore durante l'esecuzione del batch.
Per gli oggetti remoti non validi, tuttavia, non è supportata la risoluzione dei nomi posticipata. Se si utilizza una tabella remota non valida in una procedura, la procedura non viene creata e viene restituito un errore.
Nota:
Il supporto della risoluzione dei nomi posticipata, ovvero la possibilità di fare riferimento durante la compilazione a oggetti che non esistono fino alla fase di esecuzione, è applicabile solo ai nomi di tabelle o viste. Per ulteriori informazioni sulla risoluzione dei nomi posticipata, vedere CREATE PROCEDURE (Transact-SQL).
Le query del tipo seguente vengono eseguite correttamente, ovvero la tabella Y
viene ignorata e i risultati dell'istruzione SELECT
vengono inseriti nella tabella X
.
INSERT X
SELECT select_list INTO Y
Quando si esegue questa stessa query in Microsoft SQL Server 7.0 o versione successiva, viene restituito un errore di sintassi.
La stringa letterale vuota (' ') viene interpretata come spazio singolo.
La stringa letterale vuota (' ') viene interpretata come stringa vuota.
DATALENGTH('') restituisce 1 ('' viene interpretato come spazio singolo).
DATALENGTH(N'') restituisce 2 (N'' viene interpretato come spazio Unicode singolo).
DATALENGTH('') restituisce 0.
DATALENGTH(N'') restituisce 0.
LEFT('123', 0) restituisce NULL.
LEFT(N'123', 0) restituisce NULL.
LEFT('123', 0) restituisce una stringa vuota.
LEFT(N'123', 0) restituisce una stringa vuota.
LTRIM(' ') restituisce NULL.
LTRIM(N' ') restituisce NULL.
LTRIM(' ') restituisce una stringa vuota.
LTRIM(N' ') restituisce una stringa vuota.
REPLICATE('123', 0) restituisce NULL.
REPLICATE(N'123', 0) restituisce NULL.
REPLICATE('123', 0) restituisce una stringa vuota.
REPLICATE(N'123', 0) restituisce una stringa vuota.
RIGHT(N'123', 0) restituisce NULL.
RIGHT('123', integer_expression) restituisce NULL quando il valore di integer_expression è negativo.
RIGHT(N'123', integer_expression) restituisce NULL quando il valore di integer_expression è negativo.
RIGHT('123', 0) restituisce una stringa vuota.
RIGHT(N'123', 0) restituisce una stringa vuota.
RIGHT('123', integer_expression) restituisce un errore quando il valore di integer_expression è negativo.
RTRIM(' ') restituisce NULL.
RTRIM(N' ') restituisce NULL.
RTRIM(' ') restituisce una stringa vuota.
RTRIM(N' ') restituisce una stringa vuota.
SPACE(0) restituisce NULL.
SPACE(0) restituisce una stringa vuota.
La funzione SUBSTRING(expression, start, length) restituisce NULL se per start viene specificato un valore maggiore del numero di caratteri in expression o se si specifica un valore di length uguale a zero. Ad esempio, SUBSTRING(N'123', 4, 1) restituisce NULL.
A parità di condizioni SUBSTRING(expression, start, length) restituisce una stringa vuota delimitata da una coppia di virgolette singole. Ad esempio, SUBSTRING(N'123', 4, 1) restituisce ''.
UPDATETEXT table.textcolumn textpointer 0 NULL NULL restituisce un valore NULL.
UPDATETEXT table.textcolumn textpointer 0 NULL NULL restituisce testo vuoto.
Le funzioni CHARINDEX e PATINDEX restituiscono NULL solo se sia la stringa di testo che l'espressione sono NULL.
Le funzioni CHARINDEX e PATINDEX restituiscono NULL quando qualsiasi parametro di input è NULL.
I riferimenti alle colonne di tipo text o image nelle tabelle inserted e deleted vengono visualizzati come NULL.
I riferimenti alle colonne di tipo text o image nelle tabelle inserted e deleted non sono consentiti.
Se si recuperano colonne di tipo text o image dalle tabelle inserted o deleted all'interno di un trigger, per le colonne text o image vengono restituiti valori NULL.
Il recupero di colonne di tipo text o image dalle tabelle inserted o deleted all'interno di un trigger non è consentito e tale operazione causa un errore.
È consentita l'inizializzazione delle colonne di tipo text su NULL tramite UPDATETEXT.
UPDATETEXT inizializza le colonne di tipo text su una stringa vuota.
WRITETEXT inizializza le colonne di tipo text su NULL.
L'impostazione concatenation of null yields null della stored procedure sp_dboption è disattivata e viene pertanto restituita una stringa vuota se uno degli operandi di un'operazione di concatenamento è NULL.
L'impostazione concatenation of null yields null della stored procedure sp_dboption è attivata e viene pertanto restituito un valore NULL se uno degli operandi di un'operazione di concatenamento è NULL.
In un'istruzione INSERT è possibile utilizzare un'istruzione SELECT che restituisce un valore scalare nella clausola VALUES.
La clausola VALUES dell'istruzione INSERT non può includere un'istruzione SELECT come uno dei valori da inserire.
Un'istruzione ROLLBACK di una stored procedure a cui si fa riferimento in un'istruzione INSERT table EXEC procedure causa il rollback dell'istruzione INSERT, ma l'esecuzione del batch continua.
Un'istruzione ROLLBACK di una stored procedure a cui si fa riferimento in un'istruzione INSERT...EXEC causa il rollback dell'intera transazione e l'interruzione dell'esecuzione del batch.
Differenze tra i livelli di compatibilità inferiori e il livello 90
In questa sottosezione vengono descritte le nuove funzioni introdotte con il livello di compatibilità 90. Per ulteriori informazioni sulle differenze funzionali relative ai livelli di compatibilità 80 e inferiori, vedere la sezione "Parole chiave riservate" di seguito in questa sezione.
Con il livello di compatibilità 90 vengono introdotte le modifiche funzionali seguenti.
Livello di compatibilità 80 o inferiore
Livello di compatibilità 90
Probabilità di impatto
Per gli hint di blocco nella clausola FROM, la parola chiave WITH è sempre facoltativa.
Con alcune eccezioni, gli hint di tabella sono supportati nella clausola FROM solo se vengono specificati con la parola chiave WITH. Per ulteriori informazioni, vedere FROM (Transact-SQL).
Alta
Gli operatori *= e =* per gli outer join sono supportati con un messaggio di avviso.
Questi operatori non sono supportati. È necessario utilizzare la parola chiave OUTER JOIN.
Alta
Quando si associano i riferimenti di colonna nell'elenco ORDER BY alle colonne definite nell'elenco SELECT, le eventuali ambiguità vengono ignorate e a volte vengono ignorati anche i prefissi di colonna. In questo caso è possibile che il set di risultati restituisca un ordine imprevisto.
Ad esempio, una clausola ORDER BY composta da un'unica colonna in due parti (<table_alias>.<column>) e utilizzata come riferimento a una colonna in un elenco SELECT viene accettata, mentre l'alias di tabella viene ignorato. Si consideri la query seguente.
SELECT c1 = -c1 FROM t
_table AS x ORDER BY x.c1
Quando viene eseguita, il prefisso di colonna nella clausola ORDER BY viene ignorato. L'operazione di ordinamento non viene eseguita come previsto sulla colonna di origine specificata (x.c1
) ma sulla colonna c1
derivata definita nella query. Il piano di esecuzione per questa query indica che vengono innanzitutto calcolati i valori per la colonna derivata e quindi i valori calcolati vengono ordinati.
Vengono generati errori in caso di ambiguità per le colonne. Gli eventuali prefissi di colonna specificati in ORDER BY non vengono ignorati durante l'associazione alle colonne definite nell'elenco SELECT.
Si consideri la query seguente.
SELECT c1 = -c1 FROM t
_table AS x ORDER BY x.c1
Quando viene eseguita, il prefisso di colonna nella clausola ORDER BY non viene ignorato. L'operazione di ordinamento viene eseguita come previsto sulla colonna di origine specificata (x.c1
). Il piano di esecuzione per questa query indica che l'operatore di ordinamento ordina le righe restituite da t_table
e quindi vengono calcolati i valori per la colonna derivata c1
definita nell'elenco SELECT.
Media
In un'operazione INSERT SELECT da un'operazione UNION di tipi di dati diversi, per ogni ramo di UNION viene eseguito il cast diretto nel tipo della colonna di destinazione dell'operazione INSERT. Anche se l'unione potrebbe avere esito negativo a causa di conversioni di tipo non compatibili, se l'operazione venisse eseguita singolarmente, all'interno di INSERT SELECT l'operazione UNION viene completata perché il ramo per il tipo del risultato dell'operazione UNION non viene mai convertito.
In SQL Server 2005, il tipo del risultato di un'operazione UNION viene derivato in modo indipendente da INSERT SELECT. Per ogni ramo di UNION viene eseguito il cast nel tipo del risultato di UNION e quindi viene eseguito il cast nel tipo della colonna di destinazione di INSERT. Se sono presenti tipi incompatibili nell'operazione UNION, il primo cast potrebbe causare un errore. Per utilizzare il livello di compatibilità 90, è necessario correggere tutte le unioni di tipi non compatibili utilizzate in operazioni INSERT SELECT.
Media
Le operazioni di inserimento e aggiornamento tramite una vista non sono supportate correttamente nelle viste che specificano la clausola WITH CHECK OPTION se la vista o una vista a cui viene fatto riferimento utilizza la clausola TOP.
Le operazioni di inserimento e aggiornamento tramite una vista non sono supportate nelle viste che specificano la clausola WITH CHECK OPTION se la vista o una vista a cui viene fatto riferimento utilizza la clausola TOP.
Media
L'applicazione dell'operatore UNION a una colonna a lunghezza variabile e a una colonna a lunghezza fissa genera una colonna a lunghezza fissa.
L'applicazione dell'operatore UNION a una colonna a lunghezza variabile e a una colonna a lunghezza fissa genera una colonna a lunghezza variabile.
Media
L'impostazione SET XACT_ABORT OFF è consentita in un trigger.
L'impostazione SET XACT_ABORT OFF non è consentita in un trigger.
Media
La clausola FOR BROWSE è consentita (e ignorata) nelle viste.
La clausola FOR BROWSE non è consentita nelle viste.
Media
Gli errori di dominio non sono controllati da ANSI_WARNINGS. Le impostazioni ARITHABORT vengono rispettate, se l'opzione ANSI_WARNINGS è impostata su OFF e l'opzione ARITHABORT non viene modificata.
Anche gli errori di dominio vengono controllati da ANSI_WARNINGS e sono considerati errori con livello di gravità 16. Se l'opzione ANSI_WARNINGS o ARITHABORT è impostata su ON, viene generato un errore anziché restituire un valore NULL. Gli script degli utenti che dipendono dall'impostazione OFF per ARITHABORT potrebbero non funzionare più in seguito a questa modifica.
Media
Se una query pass-through eseguita su un'origine dei dati remota [OpenRowset o OpenQuery] restituisce colonne con nomi duplicati, i nomi di colonna duplicati vengono ignorati a meno che tali colonne non siano specificate in modo esplicito nella query.
Se una query pass-through eseguita su un'origine dei dati remota [OpenRowset o OpenQuery] restituisce una colonna con nomi di colonna duplicati, viene generato un errore.
Bassa
Le costanti stringa di caratteri e le costanti varbinary con dimensioni maggiori di 8000 vengono gestite come text, ntext o image.
Le costanti stringa di caratteri e le costanti varbinary con dimensioni maggiori di 8000 vengono gestite come il tipo varchar(max) (oppure rispettivamente nvarchar(max) e varbinary(max)). Ciò può causare la modifica del tipo di dati della tabella creata con SELECT … INTO se l'elenco SELECT contiene espressioni di questo tipo.
Bassa
I confronti tra tipi numerici (smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) vengono eseguiti tramite la conversione dell'elemento da confrontare con la precedenza inferiore nella gerarchia dei tipi nel tipo con precedenza maggiore.
I valori di tipo numerico vengono confrontati senza eseguire conversioni. Ciò consente di ottenere migliori prestazioni, ma è possibile che si generino differenze funzionali, in particolare nei casi in cui la conversione causa eccezioni di overflow.
Bassa
Le funzioni predefinite per i metadati che accettano argomenti stringa troncano l'input se più lungo di 4000 caratteri.
Le funzioni predefinite per i metadati generano un errore se il troncamento causa la perdita di caratteri diversi da spazi.
Bassa
Il gruppo di caratteri non consentiti in un identificatore senza virgolette è rimasto invariato.
Il parser Transact-SQL supporta lo standard Unicode 3.2, che modifica la classificazione dei caratteri per alcuni caratteri internazionali che ora non sono consentiti negli identificatori non delimitati.
Bassa
L'impostazione SET ANSI_WARNINGS ON non è prioritaria rispetto all'impostazione di SET ARITHABORT OFF nel caso di errori di dominio per valori a virgola mobile, ovvero argomenti negativi per la funzione log(). Se l'opzione ANSI_WARNINGS è impostata su ON ma ARITHABORT è OFF, gli errori di dominio per valori a virgola mobile non causano l'interruzione della query.
SET ANSI_WARNINGS ON sostituisce completamente l'impostazione ARITHABORT OFF. In questo caso, gli errori di dominio per valori a virgola mobile causano l'interruzione della query.
Bassa
Le costanti non integer sono consentite (e vengono ignorate) nella clausola ORDER BY.
Le costanti non integer non sono consente nella clausola ORDER BY.
Bassa
Sono consentite istruzioni SET vuote, ovvero senza assegnazioni di opzioni SET.
Non sono consentite clausole SET vuote.
Bassa
L'attributo IDENTITY non viene derivato correttamente per le colonne generate da una tabella derivata.
L'attributo IDENTITY viene derivato correttamente per le colonne generate da tabelle derivate.
Bassa
La proprietà per il supporto di valori Null degli operatori aritmetici applicati al tipo di dati a virgola mobile prevede sempre il supporto di valori Null.
La proprietà per il supporto di valori Null degli operatori aritmetici applicati al tipo di dati a virgola mobile viene modificata in modo da non consentire il supporto di valori Null, quando gli input non supportano valori Null e l'opzione ANSI_WARNINGS è impostata su ON.
Bassa
Nell'istruzione INSERT .. SELECT con operatore UNION, i tipi generati dai singoli set dei risultati vengono tutti convertiti nel tipo della destinazione.
Nell'istruzione INSERT .. SELECT con operatore UNION, viene individuato il tipo dominante dei vari rami e i risultati vengono convertiti in tale tipo prima della conversione nel tipo della tabella di destinazione.
Bassa
Nell'istruzione SELECT .. FOR XML, i caratteri hex(27) (carattere ') e hex(22) (carattere " ) vengono sempre sostituiti con entità, anche se non richiesto.
FOR XML sostituisce i caratteri hex(27) e hex(22) con entità solo quando richiesto. Tali caratteri non vengono sostituiti con entità nelle situazioni seguenti:
- Nel contenuto di attributi, il carattere hex(27) (carattere ') non viene sostituito con un'entità se i valori dell'attributo sono delimitati da " e il carattere hex(22) (carattere ") non viene sostituito con un'entità se i valori dell'attributo sono delimitati da '.
- Nel contenuto degli elementi, i caratteri hex(27) e hex(22) non vengono mai sostituiti con entità.
Bassa
In FOR XML, il valore timestamp viene mappato a un valore integer.
In FOR XML, il valore timestamp viene mappato a un valore binary.
Per ulteriori informazioni, vedere Supporto del tipo di dati timestamp in FOR XML.
Alta (se si utilizza una colonna timestamp); bassa, in caso contrario
In FOR XML e OPENXML, i caratteri Unicode surrogati alti (high-range, 3 byte) nei nomi vengono rappresentati utilizzando 8 posizioni.
Ad esempio, utilizzando 8 posizioni FOR XML rappresenta il punto di codice Unicode U+10000
come:
<a_x00010000_ c1="1" />
In FOR XML e OPENXML, i caratteri Unicode surrogati alti (high-range, 3 byte) nei nomi vengono rappresentati utilizzando 6 posizioni.
Ad esempio, utilizzando 6 posizioni FOR XML rappresenta il punto di codice Unicode U+10000
come:
<a_x010000_ c1="1" />
Bassa
In FOR XML, i mapping di tabelle derivate in modalità AUTO vengono gestiti in modo trasparente.
Ad esempio:
USE AdventureWorks
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a,
b.id AS b FROM Test a
JOIN Test b ON a.id=b.id)
Test FOR XML AUTO;
Se il livello di compatibilità per AdventureWorks è impostato su 80, l'esempio precedente restituisce:
<a a="1"><b b="1"/></a>
<a a="2"><b b="2"/></a>
In FOR XML, i mapping di tabelle derivate in modalità AUTO vengono gestiti in modo non trasparente.
Se il livello di compatibilità per AdventureWorks è impostato su 90, l'esempio precedente restituisce:
<Test a="1" b="1"/>
<Test a="2" b="2"/>
Per ulteriori informazioni sulle modifiche alla modalità AUTO, vedere Miglioramenti della modalità AUTO.
Alta (se alle viste è applicata la modalità FOR XML AUTO); bassa, in caso contrario
Le conversioni di stringhe nel tipo money supportano l'utilizzo di un carattere barra rovesciata (\) come simbolo di valuta solo per le lingue giapponese e coreano.
Il carattere barra rovesciata (\) è accettato per tutte le conversioni di stringhe nel tipo money in tutte le lingue. ISNUMERIC restituisce True se si utilizza \ come simbolo di valuta.
Per i database nelle versioni di SQL Server precedenti a SQL Server 2005, questo nuovo funzionamento compromette gli indici e le colonne calcolate che dipendono da un valore restituito ISNUMERIC che contiene \ e per cui la lingua non è giapponese o coreano.
Bassa
Il risultato di un operatore aritmetico supporta sempre i valori Null, anche se gli operandi non li supportano e l'opzione ANSI_WARNINGS o ARITHABORT è impostata su ON.
Quando ANSI_WARNINGS o ARITHABORT è impostata su ON, il risultato di un operatore aritmetico a virgola mobile non supporta valori Null se entrambi gli operandi non supportano valori Null.
Questa modifica nel supporto dei valori Null può causare errori se si utilizza bcp per un'esportazione di massa dei dati con formato binario da una tabella di SQL Server 2000 con una colonna calcolata che utilizza un operatore aritmetico a virgola mobile e si utilizza quindi bcp o BULK INSERT per l'importazione di massa di tali dati in una tabella di SQL Server 2005 con la stessa definizione.
Nota:
Se entrambe le opzioni sono impostate su OFF, il Motore di database contrassegna il risultato per il supporto dei valori Null. Questo avviene anche in SQL Server 2000.
Bassa
Per le funzioni predefinite che accettano parametri di tipo nvarchar, se il valore specificato è varchar, il valore viene convertito in nvarchar(4000). In SQL Server 2000, se si passa un valore di dimensioni maggiori, questo viene troncato senza avvisare.
Per le funzioni predefinite che accettano parametri di tipo nvarchar, se il valore specificato è varchar, il valore viene ancora convertito in nvarchar(4000). Tuttavia, se si passa un valore di dimensioni maggiori, SQL Server 2005 genera un errore.
Per utilizzare il livello di compatibilità 90, è necessario correggere tutto il codice personalizzato che si basa sul funzionamento precedente di troncamento.
Bassa
L'unione di una stringa a lunghezza fissa (char, binary o nchar) con una stringa a lunghezza variabile (varchar, varbinary, nvarchar) restituisce un risultato a lunghezza fissa.
L'unione di una stringa di dimensioni variabili con una stringa di dimensioni fisse restituisce una stringa di dimensioni variabili.
Per utilizzare il livello di compatibilità 90, è necessario correggere tutti gli elementi (indici, query e colonne calcolate) che dipendono dal tipo risultate dall'unione di un tipo di dimensioni variabili con un tipo di dimensioni fisse.
Bassa
I nomi di oggetto contenenti il carattere 0xFFFF sono identificatori validi.
I nomi di oggetto contenenti il carattere 0xFFFF sono identificatori non validi e non è possibile accedervi.
Per utilizzare il livello di compatibilità 90, è necessario rinominare gli oggetti che contengono tale carattere.
Bassa
In SELECT ISNUMERIC('<string>'), le virgole incorporate all'interno di <string> sono significative.
Ad esempio, la query SELECT ISNUMERIC('121212,12')
seguente restituisce 0, a indicare che la stringa 121212,12
non è numerica.
In SELECT ISNUMERIC('<string>'), le virgole incorporate all'interno di <string> vengono ignorate.
Ad esempio, la query SELECT ISNUMERIC('121212,12')
seguente restituisce 1, a indicare che la stringa 121212,12
è numerica.
Bassa
Il segno di due punti (:) che segue una parola chiave riservata in un'istruzione Transact-SQL viene ignorato.
Il segno di due punti (:) che segue una parola chiave riservata in un'istruzione Transact-SQL determina l'esito negativo dell'istruzione.
Bassa
Una clausola GROUP BY in una subquery che fa riferimento a una colonna dalla query esterna ha esito positivo.
Una clausola GROUP BY in una subquery che fa riferimento a una colonna dalla query esterna restituisce un errore, in conformità allo standard SQL.
Bassa
Parole chiave riservate
L'impostazione di compatibilità determina inoltre le parole chiave riservate dal Motore di database. Nella tabella seguente sono elencate le parole chiave riservate introdotte per ogni livello di compatibilità.
Livello di compatibilità | Parole chiave riservate |
---|---|
90 |
EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE |
80 |
COLLATE, FUNCTION, OPENXML |
70 |
BACKUP, CONTAINS, CONTAINSTABLE, DENY, FREETEXT, FREETEXTTABLE, PERCENT, RESTORE, ROWGUIDCOL, TOP |
65 |
AUTHORIZATION, CASCADE, CROSS, DISTRIBUTED, ESCAPE, FULL, INNER, JOIN, LEFT, OUTER, PRIVILEGES, RESTRICT, RIGHT, SCHEMA, WORK |
A un determinato livello di compatibilità, le parole chiave riservate includono tutte le parole chiave introdotte per tale livello e quelli precedenti. Pertanto, ad esempio, per le applicazioni con livello 90 sono riservate tutte le parole chiave elencate nella tabella precedente. Per i livelli di compatibilità inferiori, le parole chiave del livello 90 rimangono nomi di oggetti validi ma le funzionalità del linguaggio di livello 90 corrispondenti a tali parole chiave non sono disponibili.
Una volta introdotta, una parola chiave rimane riservata. La parola chiave riservata BACKUP, ad esempio, introdotta nel livello di compatibilità 70, è riservata anche per i livelli 80 e 90.
Se per un'applicazione si utilizza un identificatore che rappresenta una parola chiave riservata nel livello di compatibilità specificato, l'applicazione genererà errori. Per risolvere il problema, è possibile racchiudere l'identificatore tra parentesi quadre ([]) o virgolette (""). Ad esempio, per aggiornare un'applicazione che utilizza l'identificatore EXTERNAL al livello di compatibilità 90, è possibile modificare l'identificatore in [EXTERNAL] o "EXTERNAL".
Autorizzazioni
Solo il proprietario del database, i membri del ruolo predefinito del server sysadmin e i membri del ruolo predefinito del database db_owner (se si modifica il database corrente) sono autorizzati a eseguire questa stored procedure.
Valori restituiti
0 (esito positivo) o 1 (esito negativo)
Esempi
A. Modifica di un database per impostare il livello di compatibilità di SQL Server 2000
Nell'esempio seguente il livello di compatibilità del database AdventureWorks
viene modificato e impostato su 80
.
EXEC sp_dbcmptlevel AdventureWorks, 80;
GO
B. Effetti del livello di compatibilità su ORDER BY (scenario 1)
Nell'esempio seguente viene illustrata la differenza per le associazioni ORDER BY con i livelli di compatibilità 80 e 90. Nell'esempio viene creata una tabella di esempio, SampleTable
, nel database tempdb
.
USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO
Con il livello di compatibilità 90, ovvero il livello predefinito, l'istruzione SELECT... ORDER BY
seguente genera un errore perché il nome di colonna nella clausola AS
, c1
, è ambiguo.
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO
Dopo aver reimpostato il livello di compatibilità del database su 80
, la stessa istruzione SELECT... ORDER BY
viene completata senza problemi.
sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO
L'istruzione SELECT... ORDER BY
seguente funziona con entrambi i livelli di compatibilità.
sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO
B. Effetti del livello di compatibilità su ORDER BY (scenario 2)
Con il livello di compatibilità 90, ovvero il livello predefinito, l'istruzione SELECT...ORDER BY
seguente genera un errore perché nella clausola ORDER BY
è presente un prefisso di tabella aggiuntivo.
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO
Dopo aver reimpostato il livello di compatibilità del database su 80
, la stessa istruzione SELECT...ORDER BY
ha esito positivo.
sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO
L'istruzione SELECT...ORDER BY
seguente funziona con entrambi i livelli di compatibilità.
sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
Vedere anche
Riferimento
Stored procedure del Motore di database (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
Parole chiave riservate (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Stored procedure di sistema (Transact-SQL)
UPDATE (Transact-SQL)
Altre risorse
Opzione relativa al livello di compatibilità del database
Nuove funzionalità FOR XML
Impostazione delle opzioni di database
Utilizzo delle opzioni di SQL Server
Guida in linea e informazioni
Cronologia modifiche
Versione | Cronologia |
---|---|
17 luglio 2006 |
|
14 aprile 2006 |
|