sp_dbcmptlevel (Transact-SQL)

Actualizado: 17 de julio de 2006

Configura varios comportamientos de la base de datos para que sean compatibles con la versión especificada de SQL Server.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

Argumentos

  • [ @dbname= ] name
    Es el nombre de la base de datos cuyo nivel de compatibilidad se va a cambiar. Los nombres de las bases de datos deben ajustarse a las reglas definidas para los identificadores. name es de tipo sysname y su valor predeterminado es NULL.
  • [ @new_cmptlevel= ] version
    Es la versión de SQL Server con la que se va a hacer compatible la base de datos. version es de tipo tinyint y su valor predeterminado es NULL. Debe tener uno de los siguientes valores:

    60 = SQL Server 6.0

    65 = SQL Server 6.5

    70 = SQL Server 7.0

    80 = SQL Server 2000

    90 = SQL Server 2005

    [!NOTA] Los valores 60 y 65 han quedado obsoletos y se quitarán en una próxima versión.

    ms178653.Caution(es-es,SQL.90).gifAdvertencia:
    SQL Server Management Studio y Objetos de administración de SQL Server (SMO) no admiten el nivel de compatibilidad 60. Si usa SMO o Management Studio con una base de datos establecida en el nivel de compatibilidad 60, algunas operaciones generarán errores.

Valores de código devuelto

0 (correcto) o 1 (error)

Conjuntos de resultados

Si no se especifican parámetros o si no se especifica el parámetro name, sp_dbcmptlevel devuelve un error.

Si se especifica name sin version, el SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) devuelve un mensaje donde se indica el nivel de compatibilidad actual de la base de datos especificada.

Notas

Para las instalaciones de SQL Server 2005, 90 es el nivel de compatibilidad predeterminado. Las bases de datos creadas en SQL Server 2005 se configuran en este nivel, excepto la base de datos modelo que tiene un nivel de compatibilidad inferior. Cuando se actualiza una base de datos de una versión anterior de SQL Server a SQL Server 2005, la base de datos mantiene su nivel de compatibilidad. Esto se aplica a las bases de datos del usuario y del sistema. Utilice sp_dbcmptlevel para cambiar el nivel de compatibilidad de la base de datos a 90. Para ver el nivel de compatibilidad actual de una base de datos, consulte la columna compatibility_level en la vista de catálogo sys.databases.

Usar sp_dbcmptlevel para la compatibilidad con versiones anteriores

El procedimiento almacenado sp_dbcmptlevel sólo afecta a los comportamientos de la base de datos especificada, no de todo el servidor. sp_dbcmptlevel proporciona sólo una compatibilidad parcial con versiones anteriores de SQL Server. Use sp_dbcmptlevel como ayuda provisional para la migración, para solucionar diferencias de comportamiento entre las versiones que se controlan con el nivel de compatibilidad correspondiente. Si tiene aplicaciones de SQL Server que se ven afectadas por las diferencias de comportamiento en SQL Server 2005, conviértalas para que funcionen correctamente. Después, use sp_dbcmptlevel para cambiar el nivel de compatibilidad de la base de datos a 90. El nivel de compatibilidad nuevo de una base de datos se hace efectivo la próxima vez que se actualice la base de datos (ya sea como la base de datos predeterminada al iniciar sesión o al especificarse en una instrucción USE).

Una base de datos que contenga una vista indizada no se puede cambiar a un nivel de compatibilidad inferior al 80.

Prácticas recomendadas

Si se cambia el nivel de compatibilidad mientras hay usuarios conectados a la base de datos, pueden producirse conjuntos de resultados incorrectos para las consultas activas. Por ejemplo, si el nivel de compatibilidad cambia mientras se está compilando un plan de consulta, el plan compilado podría basarse en los niveles de compatibilidad nuevo y antiguo, lo que produciría un plan incorrecto y, posiblemente, resultados imprecisos. Además, el problema puede agravarse si se coloca el plan en la memoria caché del plan y se reutiliza en consultas sucesivas. Para evitar que los resultados de la consulta no sean exactos, es recomendable usar el siguiente procedimiento para cambiar el nivel de compatibilidad de una base de datos:

  1. Establezca la base de datos en modo de acceso de usuario único mediante ALTER DATABASE SET SINGLE_USER.
  2. Cambie el nivel de compatibilidad de la base de datos.
  3. Coloque la base de datos en modo de acceso multiusuario mediante ALTER DATABASE SET MULTI_USER.
  4. Para obtener más información acerca de cómo establecer el modo de acceso de una base de datos, vea ALTER DATABASE (Transact-SQL).

Opciones SET

Es posible que las nuevas funciones funcionen con niveles de compatibilidad anteriores, pero las opciones SET pueden necesitar ajustes. Por ejemplo, el uso del tipo de datos xml con el nivel de compatibilidad 80 requiere las opciones apropiadas de ANSI SET. Además, cuando el nivel de compatibilidad de la base de datos está establecido en 90, al establecer ANSI_WARNINGS en ON se establece implícitamente ARITHABORT en ON. Si el nivel de compatibilidad de la base de datos está establecido en 80 o un nivel inferior, debe establecerse explícitamente la opción ARITHABORT en ON. Para obtener más información, vea Opciones SET que afectan a los resultados.

Niveles de compatibilidad y procedimientos almacenados

Cuando se ejecuta un procedimiento almacenado, se utiliza el nivel de compatibilidad actual de la base de datos en la que se define. Cuando se cambia el nivel de compatibilidad de una base de datos, todos sus procedimientos almacenados se vuelven a compilar automáticamente según sea necesario.

Consideraciones del entorno para utilizar sp_dbcmptlevel

Cada llamada a sp_dbcmptlevel se debe enviar individualmente. sp_dbcmptlevel no se puede llamar desde otros contextos, como:

  • Un procedimiento almacenado.
  • Una cadena de Transact-SQL ejecutada con la sintaxis EXEC(string).
  • Lote de instrucciones de Transact-SQL.

Diferencias entre el nivel 60 ó 65 y el nivel 70, 80 ó 90

Si se establece el nivel de compatibilidad en 60 ó 65, se verán afectados muchos comportamientos. Algunos de éstos se han incluido en la columna izquierda de la tabla siguiente.

[!NOTA] Para obtener información sobre las diferencias que afectan a las aplicaciones de la versión 6.x, vea "Diferencias entre los niveles de compatibilidad inferiores y el nivel 90" más adelante en este tema y las palabras clave reservadas posteriores a la versión 6.x en la sección Notas.

Nivel de compatibilidad 60 ó 65

Nivel de compatibilidad 70 o superior

Los conjuntos de resultados de las instrucciones SELECT con una cláusula GROUP BY y sin cláusula ORDER BY se ordenan por las columnas GROUP BY.

Una cláusula GROUP BY no realiza ninguna ordenación por sí sola. Una cláusula ORDER BY se debe especificar explícitamente para que SQL Server ordene un conjunto de resultados. Para obtener más información, vea SELECT (Transact-SQL).

Las columnas precedidas de alias de tablas se aceptan en la cláusula SET de una instrucción UPDATE.

No se aceptan alias de tablas en la cláusula SET de una instrucción UPDATE. La tabla o la vista especificada en la cláusula SET debe coincidir con la especificada inmediatamente a continuación de la palabra clave UPDATE. Para obtener más información, vea UPDATE (Transact-SQL).

Las columnas de tipo bit creadas sin especificar explícitamente la opción NULL o NOT NULL en CREATE TABLE o ALTER TABLE se crean como NOT NULL.

La nulabilidad de las columnas de tipo bit que no tienen esta capacidad explícitamente viene determinada por el valor SET ANSI_NULL_DFLT_ON / SET ANSI_NULL_DFLT_OFF de la sesión o por el valor SET ANSI NULL DEFAULT de la base de datos. Para obtener más información, vea SET (Transact-SQL).

No se puede utilizar la cláusula ALTER COLUMN en ALTER TABLE.

La cláusula ALTER COLUMN se puede utilizar en ALTER TABLE. Para obtener más información, vea ALTER TABLE (Transact-SQL).

Un desencadenador creado para una tabla reemplaza a cualquier otro desencadenador del mismo tipo (INSERT, UPDATE, DELETE). La opción WITH APPEND de CREATE TRIGGER se puede utilizar para crear varios desencadenadores del mismo tipo.

Se anexan los desencadenadores del mismo tipo. Los nombres de los desencadenadores deben ser exclusivos. Se da por supuesta la opción WITH APPEND. Para obtener más información, vea CREATE TRIGGER (Transact-SQL).

Cuando un procedimiento o lote contiene nombres de objeto no válidos, se devuelve una advertencia al analizar o compilar el lote, y se devuelve un mensaje de error al ejecutarlo.

Si un objeto local no es válido, no se devuelve ninguna advertencia cuando se analiza o se compila el lote, pero se devuelve un mensaje de error cuando se ejecuta.

Sin embargo, con un objeto remoto no válido no se admite la resolución diferida de nombres (DNR); si se utiliza una tabla remota no válida en un procedimiento, el procedimiento no se crea y se devuelve un error.

ms178653.note(es-es,SQL.90).gifNota:

La compatibilidad con DNR (la posibilidad de hacer referencia durante la compilación a objetos que no existen hasta el momento de la ejecución) sólo se aplica a nombres de tabla o vista. Para obtener más información acerca de la resolución diferida de nombres, vea CREATE PROCEDURE (Transact-SQL).

Las consultas con el formato siguiente se ejecutan correctamente al omitir la tabla Y e insertar los resultados de la instrucción SELECT en la tabla X.

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 o posterior devuelve un error de sintaxis cuando se ejecuta esta misma consulta.

La cadena literal vacía (' ') se interpreta como un espacio en blanco.

La cadena literal vacía (' ') se interpreta como una cadena vacía.

DATALENGTH('') devuelve 1 ('' se analiza como un espacio).

DATALENGTH(N'') devuelve 2 (N'' se analiza como un único espacio Unicode).

DATALENGTH('') devuelve 0.

DATALENGTH(N'') devuelve 0.

LEFT('123', 0) devuelve NULL.

LEFT(N'123', 0) devuelve NULL.

LEFT('123', 0) devuelve una cadena vacía.

LEFT(N'123', 0) devuelve una cadena vacía.

LTRIM('     ') devuelve NULL.

LTRIM(N'     ') devuelve NULL.

LTRIM('     ') devuelve una cadena vacía.

LTRIM(N'     ') devuelve una cadena vacía.

REPLICATE('123', 0) devuelve NULL.

REPLICATE(N'123', 0) devuelve NULL.

REPLICATE('123', 0) devuelve una cadena vacía.

REPLICATE(N'123', 0) devuelve una cadena vacía.

RIGHT(N'123', 0) devuelve NULL. RIGHT('123', 0) devuelve NULL.

RIGHT('123', integer_expression) devuelve NULL cuando integer_expression es negativo.

RIGHT(N'123', integer_expression) devuelve NULL cuando integer_expression es negativo.

RIGHT('123', 0) devuelve una cadena vacía.

RIGHT(N'123', 0) devuelve una cadena vacía.

RIGHT('123', integer_expression) devuelve un error cuando integer_expression es negativo. RIGHT(N'123', integer_expression) devuelve un error cuando integer_expression es negativo.

RTRIM('     ') devuelve NULL.

RTRIM(N'     ') devuelve NULL.

RTRIM('     ') devuelve una cadena vacía.

RTRIM(N'     ') devuelve una cadena vacía.

SPACE(0) devuelve NULL.

SPACE(0) devuelve una cadena vacía.

La función SUBSTRING(expression, start, length) devuelve NULL si se especifica un valor de start mayor que el número de caracteres de expression, o si especifica cero como valor de length; por ejemplo, SUBSTRING(N'123', 4, 1) devuelve NULL.

En condiciones idénticas, SUBSTRING(expression, start, length) devuelve una cadena vacía delimitada por un par de comillas simples; por ejemplo: SUBSTRING(N'123', 4, 1) devuelve ''.

UPDATETEXT tabla.columnatexto punterotexto 0 NULL NULL genera un valor NULL.

UPDATETEXT tabla.columnatexto punterotexto 0 NULL NULL genera texto vacío.

Las funciones CHARINDEX y PATINDEX devuelven valores NULL sólo si el patrón y la expresión son NULL.

Las funciones CHARINDEX y PATINDEX devuelven valores NULL cuando algún parámetro de entrada es NULL.

Las referencias a las columnas de tipo text o image de las tablas inserted y deleted aparecen como NULL.

No se admiten las referencias a las columnas de tipo text o image de las tablas inserted y deleted.

La recuperación de columnas de tipo text o image de las tablas inserted o deleted dentro de un desencadenador devuelve valores NULL para las columnas de tipo text o image.

No se permite la recuperación de columnas de tipo text o image de las tablas inserted o deleted dentro de un desencadenador, y se genera un error.

Permite que UPDATETEXT inicialice las columnas de tipo text en NULL.

UPDATETEXT inicializa las columnas de tipo text en una cadena vacía.

WRITETEXT inicializa las columnas de tipo text en NULL.

La opción concatenation of null yields null de sp_dboption está deshabilitada, por lo que se devuelve una cadena vacía si alguno de los operandos de una concatenación es NULL.

La opción concatenation of null yields null de sp_dboption está habilitada, por lo que se devuelve NULL si alguno de los operandos de una concatenación es NULL.

En una instrucción INSERT, la cláusula VALUES puede incluir una instrucción SELECT que devuelva un valor escalar.

La instrucción INSERT no puede tener una instrucción SELECT en la cláusula VALUES como uno de los valores que se van a insertar.

Una instrucción ROLLBACK en un procedimiento almacenado al que se haga referencia en una instrucción INSERT table EXEC procedure hace que se revierta la instrucción INSERT, pero el lote continúa.

Una instrucción ROLLBACK en un procedimiento almacenado al que se haga referencia mediante una instrucción INSERT…EXEC hace que se revierta toda la transacción y que deje de ejecutarse el lote.

Diferencias entre los niveles de compatibilidad inferiores y el nivel 90

En esta sección se describen los comportamientos nuevos introducidos con el nivel de compatibilidad 90. Para obtener información sobre otras diferencias de comportamiento que afectan al nivel de compatibilidad 80 y a los niveles de compatibilidad inferiores, vea la sección "Palabras clave reservadas", más adelante en esta sección.

En el nivel de compatibilidad 90, se producen los siguientes cambios de comportamiento.

Nivel de compatibilidad 80 o inferior

Nivel de compatibilidad 90

Posibilidad de repercusión

En las sugerencias de bloqueo de la cláusula FROM, la palabra clave WITH siempre es opcional.

Con algunas excepciones, las sugerencias de tabla sólo se admiten en la cláusula FROM cuando las sugerencias se especifican con la palabra clave WITH. Para obtener más información, vea FROM (Transact-SQL).

Alta

Los operadores de combinación externa *= e =* se admiten con un mensaje de advertencia.

Estos operadores no se admiten; debe utilizarse la palabra clave OUTER JOIN.

Alta

Al enlazar las referencias a columnas de la lista ORDER BY con las columnas definidas en la lista SELECT, no se tienen en cuenta las ambigüedades de las columnas y, en ocasiones, tampoco los prefijos de columna. Esto puede hacer que el conjunto de resultados se devuelva en un orden inesperado.

Por ejemplo, se acepta una cláusula ORDER BY compuesta por una sola columna de dos partes (<table_alias>.<column>) utilizada para hacer referencia a un alias de columna en una lista SELECT, pero se omite el alias de la tabla. Estudie la siguiente consulta.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

Cuando se ejecuta, el prefijo de columna se omite en la cláusula ORDER BY. La operación de ordenación no se realiza en la columna de origen especificada (x.c1) como se esperaba, sino en la columna c1 derivada que se define en la consulta. El plan de ejecución para esta consulta muestra que los valores de la columna derivada se calculan primero y después se ordenan los valores calculados.

Se generan errores si hay ambigüedad en las columnas. Los prefijos de columna especificados en ORDER BY no se omiten al enlazar con una columna definida en la lista SELECT.

Estudie la siguiente consulta.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

Cuando se ejecuta, el prefijo de columna no se omite en la cláusula ORDER BY. La operación de ordenación se realiza en la columna de origen especificada (x.c1) como se esperaba. El plan de ejecución para esta consulta muestra que el operador de orden ordena las filas devueltas por t_table y después se calculan los valores para la columna derivada c1 definida en la lista SELECT.

Medio

En una instrucción INSERT SELECT de una unión (UNION) de distintos tipos de datos, cada rama de la unión se convierte directamente al tipo de la columna de destino de INSERT. Aunque la unión utilizada pudiera generar un error por sí misma debido a una conversión de tipos incompatible, INSERT SELECT hace que la unión sea correcta porque nunca se convierte la rama al tipo de resultado de la unión.

En SQL Server 2005, el tipo de resultado de UNION se deriva independientemente de INSERT SELECT. Cada rama de UNION se convierte al tipo de resultado de UNION y después se convierte al tipo de la columna de destino de INSERT. Si hay tipos incompatibles en la unión, la primera conversión podría generar un error. Para funcionar en el nivel de compatibilidad 90, es necesario corregir todas las uniones de tipos incompatibles que se utilizan dentro de INSERT SELECT.

Medio

Las operaciones de inserción y actualización a través de una vista se usan incorrectamente en las vistas que especifican la cláusula WITH CHECK OPTION cuando la vista, o una vista a la que se hace referencia, utiliza la cláusula TOP.

No existe compatibilidad con las operaciones de inserción y actualización a través de una vista para las vistas que especifican WITH CHECK OPTION cuando la vista, o una vista a la que se hace referencia, utiliza la cláusula TOP.

Media

La unión (UNION) de una columna de longitud variable y una columna de longitud fija genera una columna de longitud fija.

La unión de una columna de longitud variable y una columna de longitud fija genera una columna de longitud variable.

Media

SET XACT_ABORT OFF se admite dentro de un desencadenador.

SET XACT_ABORT OFF no se admite dentro de un desencadenador.

Media

La cláusula FOR BROWSE se admite (y se omite) en las vistas.

La cláusula FOR BROWSE no se admite en las vistas.

Media

Los errores de dominio no se controlan mediante ANSI_WARNINGS. Se utilizan los valores de ARITHABORT, si ANSI_WARNINGS se establece en OFF y no se produce ningún cambio en ARITHABORT.

Los errores de dominio se controlan también mediante ANSI_WARNINGS y son errores de gravedad 16. Si ANSI_WARNINGS o ARITHABORT es ON, se genera un error en lugar de devolver un valor NULL. Las secuencias de comandos de usuario que dependan de que ARITHABORT se establezca en OFF pueden verse interrumpidas por este cambio.

Media

Si se realiza una consulta de paso a través en un origen de datos remoto [OpenRowset u OpenQuery] y se generan columnas con nombres duplicados, se omitirán los nombres de columna duplicados a menos que las columnas se mencionen explícitamente en la consulta.

Si una consulta de paso a través en un origen de datos remoto [OpenRowset u OpenQuery] genera una columna con nombres de columna duplicados, se produce un error.

Baja

Las constantes de tipo cadena de caracteres y las constantes de tipo varbinary cuyo tamaño sea superior a 8000 se tratan como text, ntext o image.

Las constantes de tipo cadena de caracteres y las constantes de tipo varbinary cuyo tamaño sea superior a 8000 se tratan como de tipo varchar(max) (o nvarchar(max) y varbinary(max), respectivamente). Este comportamiento puede cambiar el tipo de datos de una tabla creada mediante SELECT … INTO si la lista SELECT contiene estas expresiones.

Baja

Las comparaciones entre tipos numéricos (smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) se realizan convirtiendo el elemento comparado con menor prioridad de la jerarquía de tipos al tipo cuya prioridad sea mayor.

Los valores de tipo numérico se comparan sin conversión. Esto mejora el rendimiento. Sin embargo, puede producir algunos cambios de comportamiento, especialmente cuando la conversión causa excepciones por desbordamiento.

Baja

Las funciones de metadatos integradas que utilizan argumentos de cadena truncan su entrada si ésta es superior a 4000 caracteres.

Las funciones de metadatos integradas generan un error si, debido al truncamiento, se pueden perder caracteres que no sean espacios.

Baja

El grupo de caracteres no permitidos en un identificador sin comillas permanece invariable.

El analizador de Transact-SQL admite el estándar Unicode 3.2, que modifica la clasificación de caracteres para algunos caracteres internacionales cuyo uso ahora no está permitido en los identificadores sin delimitar.

Baja

SET ANSI_WARNINGS ON no invalida el valor de SET ARITHABORT OFF en el caso de los errores de dominio de punto flotante, es decir, argumentos negativos para la función log(). Si ANSI_WARNINGS es ON pero ARITHABORT es OFF, los errores de dominio de punto flotante no provocan la finalización de la consulta.

SET ANSI_WARNINGS ON invalida completamente el valor de ARITHABORT OFF. En este caso, los errores de dominio de punto flotante hacen que la consulta finalice.

Baja

Se permiten (y omiten) las constantes no enteras en la cláusula ORDER BY.

No se permiten las constantes no enteras en la cláusula ORDER BY.

Baja

Se permiten las instrucciones SET vacías (sin asignaciones de opciones SET).

No se admite una cláusula SET vacía.

Baja

El atributo IDENTITY no se deriva correctamente para las columnas producidas por una tabla derivada.

El atributo IDENTITY se deriva correctamente para las columnas producidas por tablas derivadas.

Baja

La propiedad de nulabilidad de los operadores aritméticos en los tipos de datos de punto flotante siempre admite valores NULL.

La propiedad de nulabilidad de los operadores aritméticos en los tipos de datos de punto flotante pasa a ser que no se admiten valores NULL cuando las entradas tampoco los admiten y ANSI_WARNINGS es ON.

Baja

En la instrucción INSERT .. SELECT con UNION, todos los tipos generados en los conjuntos de resultados individuales se convierten al tipo de resultado de destino.

En la instrucción INSERT .. SELECT con UNION, se determina el tipo dominante de las distintas ramas y los resultados se convierten a ese tipo antes de ser convertidos al tipo de la tabla de destino.

Baja

En la instrucción SELECT .. FOR XML, siempre se crean entidades para hex(27) (el carácter ') y hex(22) (el carácter "), aunque no sea necesario.

FOR XML crea entidades para hex(27) y hex(22) sólo cuando es necesario. No se crean entidades para ellos en las siguientes situaciones:

  • En el contenido de los atributos, no se crea una entidad para hex(27) (el carácter ') si los valores de los atributos están delimitados con ", y no se crea una entidad para hex(22) (el carácter ") si los valores de los atributos están delimitados con '.
  • En el contenido de los elementos, nunca se crean entidades para hex(27) y hex(22).

Baja

En FOR XML, el valor de marca de hora se asigna a un entero.

En FOR XML, el valor de marca de hora se asigna a un valor binario.

Para obtener más información, vea Compatibilidad de FOR XML con el tipo de datos timestamp.

Alta si se utiliza una columna timestamp; en caso contrario, es Baja

En FOR XML y OPENXML, los caracteres Unicode de intervalo alto (3 bytes) en los nombres se representan utilizando 8 posiciones.

Por ejemplo, con 8 posiciones FOR XML representa el punto de código Unicode U+10000 como:

<a_x00010000_ c1="1" />

En FOR XML y OPENXML, los caracteres Unicode de intervalo alto (3 bytes) en los nombres se representan utilizando 6 posiciones.

Por ejemplo, con 6 posiciones FOR XML representa el punto de código Unicode U+10000 como:

<a_x010000_ c1="1" />

Baja

En FOR XML, las asignaciones de tablas derivadas en modo AUTO se tratan de manera transparente.

Por ejemplo:

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;

Cuando el nivel de compatibilidad de AdventureWorks se establece en 80, el ejemplo anterior genera el siguiente resultado:

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

En FOR XML, las asignaciones de tablas derivadas en modo AUTO se tratan de manera opaca.

Cuando el nivel de compatibilidad de AdventureWorks se establece en 90, el ejemplo anterior genera el siguiente resultado:

<Test a="1" b="1"/>

<Test a="2" b="2"/>

Para obtener más información acerca de los cambios del modo AUTO, vea Mejoras del modo AUTO.

Alta si el modo AUTO de FOR XML se aplica a las vistas; en caso contrario, es Baja

En las conversiones de cadenas al tipo money se permite el uso de la barra diagonal inversa (\) como símbolo de moneda sólo en los idiomas japonés y coreano.

La barra diagonal inversa (\) se acepta en todas las conversiones de cadenas al tipo money en todos los idiomas. ISNUMERIC devolvería True si se utilizara \ como símbolo de moneda.

En bases de datos de versiones de SQL Server anteriores a SQL Server 2005, este nuevo comportamiento separa los índices y las columnas calculadas que dependen de un valor devuelto de ISNUMERIC que contiene \ y cuyo idioma no es japonés ni coreano.

Baja

El resultado de un operador aritmético siempre admite valores NULL, incluso aunque los operandos no los admitan y ANSI_WARNINGS o ARITHABORT se hayan establecido en ON.

Cuando ANSI_WARNINGS o ARITHABORT se establecen en ON, el resultado de un operador aritmético de punto flotante no admite valores NULL si ambos operandos no los aceptan.

Este cambio en la nulabilidad podría generar errores si se utiliza bcp para exportar de forma masiva datos que utilizan el formato binario de una tabla de SQL Server 2000 con una columna calculada que utiliza un operador aritmético de punto flotante y después se utiliza bcp o BULK INSERT para importar de forma masiva esos datos a una tabla de SQL Server 2005 con la misma definición.

ms178653.note(es-es,SQL.90).gifNota:

Cuando ambas opciones están establecidas en OFF, Database Engine (Motor de base de datos) marca el resultado para admitir valores NULL. Ocurre lo mismo que en SQL Server 2000.

Baja

Para las funciones integradas que utilizan nvarchar como parámetro, si el valor suministrado es de tipo varchar, el valor se convierte a nvarchar (4000). En SQL Server 2000, si se pasa un valor mayor, se trunca sin indicarse.

Para las funciones integradas que utilizan nvarchar como parámetro, si el valor suministrado es de tipo varchar, el valor todavía se convierte a nvarchar (4000). Sin embargo, si se pasa un valor mayor, SQL Server 2005 genera un error.

Para trabajar en el nivel de compatibilidad 90, debe corregir el código personalizado que se base en el comportamiento de truncamiento.

Baja

Una unión de una cadena de longitud fija (char, binary o nchar) y una cadena de longitud variable (varchar, varbinary, nvarchar) devuelve un resultado de longitud fija.

La unión de una cadena de tamaño variable y una cadena de tamaño fijo devuelve una cadena de tamaño variable.

Para trabajar en el nivel de compatibilidad 90, debe corregir todos los elementos (índices, consultas y columnas calculadas) que dependan del tipo resultante de una unión de un tipo de tamaño variable y un tipo de tamaño fijo.

Baja

Los nombres de objeto que contienen el carácter 0xFFFF son identificadores válidos.

Los nombres de objetos que contienen el carácter 0xFFFF no son identificadores válidos y no se puede tener acceso a ellos.

Para trabajar en el nivel de compatibilidad 90, debe cambiar el nombre de los objetos que contengan este carácter.

Baja

En SELECT ISNUMERIC('<string>'), las comas incrustadas incluidas en <string> son significativas.

Por ejemplo, la siguiente consulta SELECT ISNUMERIC('121212,12') devuelve 0. Esto indica que la cadena 121212,12 no es numérica.

En SELECT ISNUMERIC('<string>'), se omiten las comas incrustadas incluidas en <string>.

Por ejemplo, la siguiente consulta SELECT ISNUMERIC('121212,12') devuelve 1. Esto indica que la cadena 121212,12 es numérica.

Baja

El signo de dos puntos (:) que siguen a una palabra clave reservada en una instrucción de Transact-SQL se omitirá.

El signo de dos puntos (:) que sigue a una palabra clave reservada en una instrucción de Transact-SQL provocará un error en la instrucción.

Baja

Una cláusula GROUP BY de una subconsulta que hace referencia a una columna de la consulta externa se ejecuta correctamente.

Una cláusula GROUP BY de una subconsulta que hace referencia a una columna de la consulta externa devuelve un error según el estándar SQL.

Baja

Palabras clave reservadas

El nivel de compatibilidad también determina las palabras clave que reserva Database Engine (Motor de base de datos). En la tabla siguiente se muestran las palabras clave reservadas que introduce cada nivel de compatibilidad.

Configuración de nivel de compatibilidad Palabras clave reservadas

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

En un nivel de compatibilidad dado, las palabras clave reservadas incluyen todas las introducidas en ese nivel o por debajo. Por ejemplo, para las aplicaciones del nivel 90, todas las palabras clave mostradas en la tabla anterior son reservadas. En los niveles de compatibilidad inferiores, las palabras del nivel 90 siguen siendo nombres de objeto válidos, pero las características de idioma del nivel 90 correspondientes a esas palabras clave no están disponibles.

Una vez introducida, una palabra clave permanece reservada. Por ejemplo, la palabra clave reservada BACKUP, que se introdujo en el nivel de compatibilidad 70, está también reservada en los niveles 80 y 90.

Si una aplicación utiliza un identificador que está reservado como palabra clave para su nivel de compatibilidad, la aplicación generará un error. Para evitar este problema, incluya el identificador entre corchetes ([]) o comillas (""); por ejemplo, para actualizar una aplicación que utiliza el identificador EXTERNAL al nivel de compatibilidad 90, podría cambiar el identificador a [EXTERNAL] o "EXTERNAL"".

Permisos

Sólo el propietario de la base de datos, los miembros de la función fija de servidor sysadmin y la función fija de base de datos db_owner (si va a cambiar la base de datos actual) pueden ejecutar este procedimiento.

Ejemplos

A. Cambiar el nivel de compatibilidad a SQL Server 2000

En el ejemplo siguiente se cambia el nivel de compatibilidad de la base de datos AdventureWorks a 80.

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

B. Efecto del nivel de compatibilidad en ORDER BY (escenario 1)

En el ejemplo siguiente se muestra la diferencia del enlace ORDER BY para los niveles de compatibilidad 80 y 90. Se crea una tabla de ejemplo, SampleTable, en la base de datos tempdb.

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

En el nivel de compatibilidad 90, que es el predeterminado, la siguiente instrucción SELECT... ORDER BY genera un error porque el nombre de la columna de la cláusula AS, c1, es ambiguo.

SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

Después de restablecer la base de datos al nivel de compatibilidad 80, la misma instrucción SELECT... ORDER BY se ejecuta correctamente.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

La siguiente instrucción SELECT... ORDER BY funciona en ambos niveles de compatibilidad.

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

C. Efecto del nivel de compatibilidad en ORDER BY (escenario 2)

En el nivel de compatibilidad 90, que es el predeterminado, la siguiente instrucción SELECT...ORDER BY genera un error porque hay un prefijo de tabla adicional en la cláusula ORDER BY.

SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

Después de restablecer la base de datos al nivel de compatibilidad 80, la misma instrucción SELECT...ORDER BY se ejecuta correctamente.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

La siguiente instrucción SELECT...ORDER BY funciona en ambos niveles de compatibilidad.

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

Vea también

Referencia

Procedimientos almacenados del motor de base de datos (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
Palabras clave reservadas (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Procedimientos almacenados del sistema (Transact-SQL)
UPDATE (Transact-SQL)

Otros recursos

Opción del nivel de compatibilidad de la base de datos
Nuevas características de FOR XML
Configurar las opciones de la base de datos
Usar las opciones de SQL Server

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

17 de julio de 2006

Contenido actualizado:
  • Se quitó la frase "El nivel de compatibilidad de la base de datos maestra no se puede modificar".

14 de abril de 2006

Contenido nuevo:
  • Se agregó la sección "Prácticas recomendadas".
  • Se agregó texto acerca del comportamiento de GROUP BY en una subconsulta.