Задание или изменение параметров сортировки столбца

Для типов данных char, varchar, text, nchar, nvarchar и ntext параметры сортировки базы данных можно переопределить, указав другие параметры сортировки для определенного столбца таблицы одним из следующих способов.

  • Предложением COLLATE в инструкциях CREATE TABLE и ALTER TABLE. Например.

    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. Дополнительные сведения см. в разделе Поддержка параметров сортировки и Юникода.

  • Использование свойства Column.Collation в объектах SMO SQL Server.

Невозможно изменить параметры сортировки столбца, на который ссылаются:

  • вычисляемый столбец;

  • индекс;

  • статистика распределения, созданная автоматически либо с помощью инструкции CREATE STATISTICS;

  • ограничение CHECK;

  • ограничение FOREIGN KEY.

При работе с базой данных tempdb предложение COLLATE содержит параметр database_default, указывающий, что столбец, находящийся во временной таблице, использует параметры сортировки по умолчанию для текущей базы данных пользователя для соединения, а не параметра сортировки базы данных tempdb.

Параметры сортировки и столбцы типа text

В столбце типа text можно добавлять или обновлять значения, имеющие параметры сортировки, отличные от кодовой страницы параметров сортировки по умолчанию для базы данных. SQL Server неявно преобразует значения в параметры сортировки столбца.

Параметры сортировки и база данных tempdb

База данных tempdb создается каждый раз при запуске SQL Server и имеет те же параметры сортировки по умолчанию, что и база данных model. Обычно они совпадают с параметрами сортировки экземпляра. Если при создании пользовательской базы данных указываются параметры сортировки, отличные от параметров сортировки базы данных model, то параметры сортировки пользовательской базы данных будут отличаться от базы данных tempdb. Все временные хранимые процедуры и временные таблицы создаются и сохраняются в базе данных tempdb. Это означает, что неявно столбцы временных таблиц и все константы, переменные и параметры хранимых процедур имеют параметры сортировки, отличные от сравниваемых объектов, создаваемых в постоянных таблицах и хранимых процедурах.

Это может привести к проблемам из-за различия параметров сортировки у объектов в пользовательских и системных базах данных. Например, экземпляр SQL Server использует параметры сортировки Latin1_General_CS_AS, выполняется следующая инструкция:

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

В рассматриваемой системе база данных tempdb использует параметры сортировки Latin1_General_CS_AS с кодовой страницей 1252, а база данных TestDB и столбец TestPermTab.Col1 — параметры сортировки Estonian_CS_AS с кодовой страницей 1257. Например:

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

Согласно предыдущему примеру, база данных tempdb использует параметры сортировки Latin1_General_CS_AS, а база данных TestDB и столбец TestTab.Col1 параметры сортировки Estonian_CS_AS. Например:

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

Поскольку база данных tempdb использует параметры сортировки сервера по умолчанию, а столбец TestPermTab.Col1 — другие параметры сортировки, SQL Server возвратит следующую ошибку: «Невозможно разрешить конфликт параметров сортировки между 'Latin1_General_CI_AS_KS_WS' и 'Estonian_CS_AS' в операции равенства».

Избавиться от этой ошибки можно одним из следующих способов:

  • укажите, что столбец временной таблицы использует параметры сортировки по умолчанию пользовательской базы данных, а не базы данных tempdb. Это позволит таблице работать с аналогичными таблицами в разных базах данных, если это необходимо;

    CREATE TABLE #TestTempTab
       (PrimaryKey int PRIMARY KEY,
        Col1 nchar COLLATE database_default
       );
    
  • укажите правильные параметры сортировки в столбце #TestTempTab:

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

См. также

Основные понятия

Задание или изменение параметров сортировки сервера

Установка и изменение параметров сортировки базы данных

Поддержка параметров сортировки и Юникода