2010-10-25 5 views
1

Я только что узнал, что с тех пор, как я создал свою БД на другом сервере, который имел различную сортировку, а затем иммигрировал на новый сервер с новой сортировкой, теперь у меня возникают проблемы, и я решил изменить все значения старой сортировки.Невозможно обновить sys.columns - любой другой подход?

Так что я пытался выполнить этот запрос:

sp_configure "Allow Updates", 1 
GO 
RECONFIGURE WITH OVERRIDE 
GO 

UPDATE sys.columns SET collation_name = 
    'SQL_Latin1_General_CP1_CI_AS' WHERE collation_name = 'Hebrew_CI_AS' 
GO 

sp_configure "Allow Updates", 0 
GO 
RECONFIGURE 
GO 

Но вот выход запроса:

Configuration option 'allow updates' changed from 0 to 1. 
    Run the RECONFIGURE statement to install. 

Msg 259, Level 16, State 1, Line 2 
Ad hoc updates to system catalogs are not allowed. 

Configuration option 'allow updates' changed from 1 to 0. 
    Run the RECONFIGURE statement to install. 

UPDATE
Согласно ответам реветь, я просто смотрю для автоматизированного способа выполнения действия.

+4

Таблицы SYS доступны только для чтения - вам нужно получить список и обновить сопоставление с фактической таблицей/столбцом –

+0

@OMG Ponies, ОК, поэтому в нижней строке есть автоматизированный способ сделать это, так как я Я говорю о большом количестве столбцов в разных таблицах. Я думаю, что создам консольное приложение, которое генерирует скрипт SQL в соответствии со значениями из sys.columns и sys.tables, если у вас есть другие более короткие способы, пожалуйста, дайте понять. – Shimmy

+0

Можете ли вы описать - какие проблемы? Обратите внимание, что вы, вероятно, имеете зависимости от столбцов с соответствующей сортировкой, таких как ограничения, индексы и т. Д. Вы не сможете изменить сортировку, не отбрасывая их в первую очередь. Я сомневаюсь, что вы должны это делать так, как вы правильно поняли, почему и что делать. Например, почему вы делаете это в целевой (производственной?) Базе данных? Почему эта сортировка на первом месте? Почему бы вам не изменить сортировку на сервере разработки? Как вы собираетесь его поддерживать? –

ответ

1

Этого запрос генерирует скрипт, который будет поменять все Hebrew_CI_AS разбор по столбцам Latin1_General_CI_AS сортировки:

DECLARE @Script varchar(MAX) 
SET @Script = CAST((
SELECT 'ALTER TABLE [' + Tables.Name + '] ALTER COLUMN [' + 
    [Columns].Name + '] ' + Types.Name + '(' + 
    CAST([Columns].max_length AS varchar) + ') COLLATE Latin1_General_CI_AS ' + 
    CASE WHEN [Columns].is_nullable = 0 THEN 'NOT ' ELSE '' END + 'NULL ' 
FROM sys.tables Tables INNER JOIN sys.all_columns [Columns] 
    ON [Tables].[object_id] = [Columns].[object_id] 
    INNER JOIN sys.types Types ON [Columns].system_type_id = Types.system_type_id 
WHERE [Columns].collation_name = 'Hebrew_CI_AS' 
FOR XML PATH('') 
) AS varchar(MAX)) 

PRINT @Script 
EXEC(@Script) 

ПРИМЕЧАНИЕ: Для столбцов, которые индексируются/ограничены вам нужно будет вручную отредактировать, но это тоже так, поскольку при выполнении вышеуказанного запроса результат ошибки (для ограничения и т. д.) содержит таблицу &, вы должны признать, что это все же лучше, чем все вручную.

+0

Можно ли пометить это сообщение как ответ?потому что собеседник не получит репутацию на свой собственный ответ –

+0

@ vgv8 благодарит за кредит – Shimmy

2

Вы можете использовать alter table, чтобы изменить сортировку для каждого столбца.

Единственный способ изменить настройку базы данных - это сбросить и воссоздать базу данных.

4

Вам необходимо выдать команды ALTER TABLE, чтобы изменить сортировки конкретных столбцов.

например.

ALTER TABLE YourTable 
ALTER COLUMN ColA VARCHAR(10) COLLATE Latin1_General_CI_AS NOT NULL 

Заканчивать this MSDN reference