2013-05-22 3 views
2

Мы испытываем трудности в управлении различными базами данными клиентов:Alter столбца без изменения параметров сортировки

Мы должны изменить первичный ключ столбец из VARCHAR(20) в VARCHAR(40)без изменения сверки. Причина этого заключается в том, что мы используем нестандартную настройку по умолчанию, а столбец, который мы хотим изменить, учитывает регистр и должен оставаться таким.

Обычно это не было бы никаких проблем, мы могли бы сказать ему, чтобы сохранить сортировки с учетом регистра:

ALTER TABLE Commiss 
    ALTER COLUMN CommissName VARCHAR(40) 
     COLLATE Latin1_General_CS_AS NOT NULL; 

Однако, некоторые из наших клиентов имеют разные параметры сортировки по умолчанию (французский, китайский, ...). До сих пор мы всегда могли использовать те же самые скрипты обновлений для всех клиентов. Теперь перед обновлением схемы нам нужно изменить все операторы ALTER COLUMN на правильную сортировку.

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

ALTER TABLE Commiss 
    ALTER COLUMN CommissName VARCHAR(40) 
     COLLATE CS_AS NOT NULL; 

Так эффективно держать язык, как это и только «изменение» чувствительность к регистру.

Спасибо!

ответ

2

К сожалению, не в таблице ALTER непосредственно

Вы можете создать эти заявления, хотя из sys.columns:

DECLARE @sql nvarchar(1000); 

SELECT 
    @sql = 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(c.object_id) + '.' + OBJECT_NAME(c.object_id)) + 
    ' ALTER COLUMN ' + QUOTENAME(C.name) + ' VARCHAR(40) 
     COLLATE ' + c.collation_name + ' NOT NULL;' 
FROM 
    sys.columns C 
WHERE 
    c.object_id = OBJECT_ID('dataenum.host') 
    AND 
    C.name = 'hostname'; 

SELECT @sql; 

--EXEC (@sql); 
+0

Я надеялся, что будет более простым способом. Я боюсь, что это слишком много для простого утверждения, подобного этому. Вероятно, мы будем использовать другой подход и разрешить сопоставление для CI и CS в начале сценария один раз и установить правильную сортировку для клиента до запуска скрипта. В любом случае, я отмечу это как ответ, если в следующий час ничего не произойдет. – Excelcius

+0

@Excelcius: Хорошо. Вам придется вручную редактировать инструкции ALTER вручную на клиент/сопоставление. Нет никакого волшебного трюка, чтобы сделать то, что вы хотите – gbn

+0

@Excelcius: после вашего обновления комментариев это вам не поможет. Вам по-прежнему нужен динамический SQL для своих операторов ALTER, потому что вы не можете его параметризовать. – gbn

Смежные вопросы