Поделиться через


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

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

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

    CREATE TABLE MyTable  (PrimaryKey   int PRIMARY KEY,   CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  )GOALTER TABLE MyTable ALTER COLUMN CharCol            varchar(10)COLLATE Latin1_General_CI_AS NOT NULLGO
    
  • При помощи среды Среда SQL Server Management Studio. Дополнительные сведения см. в разделе Свойства столбца таблицы (среда SQL Server Management Studio).

  • Используя свойство Column.Collation в объектах SMO.

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

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

  • индекс;

  • статистика распределения, созданная автоматически либо с помощью инструкции 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 TestPermTabCREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar )INSERT INTO #TestTempTab         SELECT * FROM TestPermTabGO

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

SELECT * FROM TestPermTab 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   )