Як змінити зіставлення SQL Server


27

Як я можу змінити зіставлення за замовчуванням SQL Server 2008 R2 Express для всього сервера та певної бази даних?

Чи є спосіб зробити це за допомогою візуального інтерфейсу SQL Server Management Studio? У вікні "Властивості сервера" (і у відповідному вікні "Властивості бази даних") ця властивість недоступна для редагування.


2
Якщо ви хочете змінити зіставлення всіх стовпців у базі даних, подивіться на цей сценарій . Я сам не пробував цього, але знайшов його для колеги, який хотів зробити саме це.
Justin Dearing

2
Якщо ви хочете змінити складання бази даних, перегляньте цей інструмент: codeproject.com/KB/database/ChangeCollation.aspx Він працює з SQL Server 2005 та 2008, і він працював для мене краще, ніж сценарії, які ви можете знайти в павутина.
Ервін

Відповіді:


25

Так.

Ви можете змінити зіставлення за замовчуванням експрес-екземпляра SQL Server 2008 R2 та окремих баз даних, але це складне завдання.

На жаль, немає візуального варіанту зробити це через SSMS.

SQL Server 2008 підтримує параметри порівняння на наступних рівнях:

  • Сервер

  • База даних

  • Стовпчик

  • Вираз

Параметри встановлення за замовчуванням визначаються локальною системою Windows. Порівнювання на рівні сервера може бути змінено під час налаштування, або шляхом зміни локальної системи Windows перед встановленням. більше ...

Налаштування та зміна серверного збору - SQL Server 2008

  • Переконайтеся, що у вас є вся інформація чи сценарії, необхідні для відновлення ваших баз даних користувачів та всіх об’єктів у них.

  • Експортуйте всі свої дані за допомогою інструмента, такого як bcp Utility. Для отримання додаткової інформації див. Імпорт та експорт масових даних.

  • Відкиньте всі бази даних користувачів.

  • Перебудуйте головну базу даних із зазначенням нового зіставлення у властивості SQLCOLLATION команди настройки

  • Створіть усі бази даних та всі об’єкти в них.

  • Імпортуйте всі свої дані.

Налаштування та зміна зіставлення баз даних - SQL Server 2008

  • Встановіть COLLATIONпараметр у CREATE DATABASEвиписці під час створення нової бази даних.
  • Аналогічно встановіть COLLATIONпараметри в ALTER DATABASEоператорі для зміни зіставлення існуючої бази даних.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Налаштування та зміна зібрання стовпців

  • Деякі зіставлення стовпців залишаться незмінними навіть після зміни порівняння бази даних. У цьому випадку вам доведеться змінити зіставлення окремих стовпців.

6

Будьте впевнені, що ви дійсно хочете "скинути" користувальницькі бази даних, як зазначено у відповіді вище. Ви можете просто захотіти "від'єднати" бази даних. Або дійсно, ви нічого не можете зробити, оскільки відбудова майстра ефективно видаляє будь-які посилання на користувальницькі бази даних. Бувають випадки, коли бази даних створюються в потрібному порівнянні, але сервер цього не робить. У цьому випадку вам не потрібно буде відновлювати всі ваші бази даних користувачів.


5

Я зробив щось подібне, і це спрацювало, але ви повинні пам’ятати про індекси, які вказують на тип даних, оскільки текст / varchar / nvarchar повинні бути скинуті, запустити сценарій, а потім створити індекси.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

це моя перша відповідь, опублікована пробачення мій безлад


-1

Експорт усіх даних (включаючи входи в систему, пов’язані сервери, завдання SQL Agent, налаштування пошти DB тощо) та відновлення даних на рівні екземпляра, а також перезавантаження всіх даних користувачів - це велика робота. І навіть після цього все ще немає гарантії, що ви можете оновити зіставлення бази даних за замовчуванням через те, ALTER DATABASEщо існує кілька умов, які запобігають завершенню операції (див. Розділ "Зміна зібрання бази даних" у розділіALTER DATABASE детальну інформацію документації ) .

Однак існує бездокументований метод, який багато простіше. Основним недоліком є ​​те, що він не підтримується. Це не означає, що щось піде не так, лише якщо Microsoft щось не зробить, Microsoft не допоможе це виправити (адже вони ніколи не гарантували, що це буде працювати).

Метод, про який я говорю, працює sqlservr.exeза допомогою -q {new_collation_name}перемикача. У цьому є трохи більше, але це основна ідея. Цей метод просто оновлює системні метадані, що має переваги та наслідки, основними з яких є:

ПЕРЕВАГИ

  • досить швидко
  • обійти більшість обмежень, які заважають ALTER DATABASE працювати
  • ймовірно, набагато точніший за будь-який сценарій, який люди придумували протягом багатьох років для скидання та відтворення об’єктів

КРЕСЛЕННЯ

  • непідтримується, якщо щось піде не так
  • VARCHARдані можуть змінюватися, якщо кодова сторінка відрізняється між старим і новим зіставленням, і символи зі значеннями 128 - 255 (0x80 - 0xFF) існують, і ці символи не існують як один і той же символ з тим же значенням у новому коді сторінки. Тож існує потенціал для втрати даних, і ваші дані спочатку потребують дослідження, щоб переконатися, що ця умова не існує. Але це також означає, що є чимало випадків, коли лише символи мають значення 0 - 127, які не становлять ніякої небезпеки, навіть якщо кодова сторінка змінюється.
  • Визначені користувачем типи таблиць (UDTT) пропускаються і потребують оновлення вручну.

Щоб отримати детальний опис того, що sqlservr.exe -qметод робить, а що не робить (включаючи детальну інформацію про те, як працюють збірки на різних рівнях, та потенційні проблеми, на які слід спостерігати), будь ласка, дивіться мій пост:

Зміна зібрання екземпляра, баз даних та всіх стовпців у всіх базі даних користувачів: що може бути помилковим?

Щоб змінити тільки примірник ( у тому числі баз даних системи: master, model, msdb, і tempdb) і один або кілька баз даних (але не всі бази даних), просто від'єднання бази даних (и) , які ви хочете виключити з цієї операції, а потім повторно докласти їх як тільки оновлення порівняння завершиться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.