Невозможно обновить sys.columns - любой другой подход? - PullRequest
1 голос
/ 25 октября 2010

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

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

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
Согласно ответам ниже, я просто ищу автоматизированный способ выполнения действия.

Ответы [ 3 ]

4 голосов
/ 26 октября 2010

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

, например

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

Проверьте этот MSDN ссылка

2 голосов
/ 26 октября 2010

Этот запрос генерирует скрипт, который поменяет все 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)

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

2 голосов
/ 26 октября 2010

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

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

...