Establecer o cambiar la intercalación de columnas

Puede invalidar la intercalación de base de datos para los datos char, varchar, text, nchar, nvarchar y ntext especificando una intercalación diferente para una columna específica de una tabla y utilizando una de las siguientes cláusulas:

  • La cláusula COLLATE de CREATE TABLE y ALTER TABLE. Por ejemplo:

    CREATE TABLE dbo.MyTable  
      (PrimaryKey   int PRIMARY KEY,  
       CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  
      );  
    GO  
    ALTER TABLE dbo.MyTable ALTER COLUMN CharCol  
                varchar(10)COLLATE Latin1_General_CI_AS NOT NULL;  
    GO  
    
  • SQL Server Management Studio. Para obtener más información, vea Collation and Unicode Support.

  • Uso de la Column.Collation propiedad en SQL Server Objetos de administración (SMO).

No puede cambiar una intercalación de una columna a la que se hace referencia mediante uno de los siguientes elementos:

  • Una columna calculada

  • Un índice

  • Estadísticas de distribución, ya sean generadas automáticamente o mediante la instrucción CREATE STATISTICS

  • Una restricción CHECK

  • Una restricción FOREIGN KEY

Al trabajar con la base de datos tempdb, la cláusula COLLATE incluye una opción database_default para especificar que una columna de una tabla temporal use el valor predeterminado de intercalación de la base de datos del usuario actual para la conexión en lugar de la intercalación de tempdb.

Intercalaciones y columnas de texto

Puede insertar o actualizar los valores de una columna text cuya intercalación sea diferente a la de la página de códigos de la intercalación predeterminada de la base de datos. SQL Server convierte implícitamente los valores a la intercalación de la columna.

Intercalación y tempdb

La base de datos tempdb se crea cada vez que se inicia SQL Server y tiene la misma intercalación predeterminada que la base de datos model . Suele ser la misma que la intercalación predeterminada de la instancia. Si crea una base de datos de usuario y especifica una intercalación predeterminada distinta de model, la base de datos de usuario tiene una intercalación predeterminada distinta de tempdb. Todos los procedimientos almacenados temporales o tablas temporales se crean y se almacenan en tempdb. Esto significa que todas las columnas implícitas de las tablas temporales y todas las constantes, variables y parámetros coaccionable-predeterminados en los procedimientos almacenados temporales tienen intercalaciones distintas de los objetos comparables creados en las tablas y procedimientos almacenados permanentes.

Esto puede causar problemas con una discrepancia en intercalaciones entre bases de datos definidas por el usuario y objetos de base de datos del sistema. Por ejemplo, una instancia de SQL Server utiliza la intercalación Latin1_General_CS_AS y se ejecutan las siguientes instrucciones:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

En este sistema, la base de datos tempdb usa la intercalación Latin1_General_CS_AS con la página de códigos 1252, y TestDB y TestPermTab.Col1 usan la intercalación Estonian_CS_AS con la página de códigos 1257. Por ejemplo:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

Con el ejemplo anterior, la base de datos tempdb usa la intercalación Latin1_General_CS_AS collation, y TestDB y TestTab.Col1 usan la intercalación Estonian_CS_AS . Por ejemplo:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

Dado que tempdb usa la intercalación de servidor predeterminada y TestPermTab.Col1 usa una intercalación diferente, SQL Server devuelve este error: "No se puede resolver el conflicto de intercalación entre 'Latin1_General_CI_AS_KS_WS' y 'Estonian_CS_AS' en la operación Igual a".

Para evitar el error, puede utilizar cualquiera de las alternativas siguientes:

  • Especifique que la columna de la tabla temporal utilice la intercalación predeterminada de la base de datos de usuario, no tempdb. Esto permite que la tabla temporal trabaje con tablas de un formato parecido en varias bases de datos, si es un requisito de su sistema.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Especifique la intercalación correcta de la columna #TestTempTab :

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

Vea también

Configurar o cambiar la intercalación del servidor
Establecer o cambiar la intercalación de base de datos
Compatibilidad con la intercalación y Unicode