Самый быстрый способ изменить типы данных - PullRequest
1 голос
/ 07 марта 2011

Необходимо обновить базу данных, и в рамках обновления я хочу преобразовать все поля TEXT / NTEXT в схеме dbo в тип данных NVARCHAR (MAX).Однако данные в этих полях не могут быть изменены.

Это обновление необходимо выполнить с помощью сценария SQL!

Итак, как это сделать?
(без необходимости писать ALTER TABLE bla ALTER COLUMN blabla NVARCHAR(MAX) blablabla ...)

1 Ответ

2 голосов
/ 07 марта 2011

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

declare @nsql nvarchar(2000)
  , @table sysname
  , @column sysname
  , @type sysname
  , @is_nullable bit

declare cur cursor local read_only
for 
select tableName = OBJECT_NAME([object_id]), columnName = name, type = TYPE_NAME(system_type_id), is_nullable from sys.columns where TYPE_NAME(system_type_id) in ('text', 'ntext')

open cur
fetch next from cur into @table, @column, @type, @is_nullable

WHILE (@@FETCH_STATUS = 0)
  BEGIN
    select @nsql = N'ALTER TABLE ' + quotename(@table) + N' ALTER COLUMN ' + quotename(@column) + N' '
    if @type = N'text'
      select @nsql = @nsql + N' VARCHAR(MAX)'
    if @type = N'ntext'
      select @nsql = @nsql + N' NVARCHAR(MAX)'
    if @is_nullable = 0
      select @nsql = @nsql + N' NOT NULL'
    exec(@nsql)

    fetch next from cur into @table, @column, @type, @is_nullable
  END

close cur
deallocate cur

Если вы также используете «типы псевдонимов», вам придется пройти немного больше боли, чтобы исправить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...