Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перевод базы данных на Unicode  [new]
codec
Member

Откуда: Харьков, Украина
Сообщений: 73
Передо мной стоит задача перевести все текстовые поля таблиц в unicode формат (varchar to nvarchar, text to ntext).
Метод "ручками" отпадает сразу, т.к. при том кол-ве таблиц, которое в базе - это ручной работы на неделю минимум.
Я пытаюсь использовать метод динамического построения SQL и sp_executesql.
Все в таком стиле

begin transaction

declare @sql_string nvarchar(2000)
declare @table_name nvarchar(50)
declare @column_name nvarchar(50)
declare @type_name nvarchar(50)
declare @nullable nvarchar(50)
declare @prec nvarchar(10)

declare @errors_count int
set @errors_count = 0
declare @modified_count int
set @modified_count = 0

declare colcursor cursor for
select
	sysobjects.name as table_name,
	syscolumns.name as column_name,
	systypes.name as type_name,
	case syscolumns.isnullable
		when 0 then 'not null'
		when 1 then 'null'
	end as nullable,
	syscolumns.prec
from
	syscolumns
		inner join systypes on systypes.xtype = syscolumns.xtype
		inner join sysobjects on sysobjects.id = syscolumns.id
where
	systypes.name = 'varchar' and
	sysobjects.xtype = 'U'
order by
	sysobjects.name,
	syscolumns.name

open colcursor
fetch next from colcursor into @table_name, @column_name, @type_name, @nullable, @prec
while @@fetch_status = 0
begin
	set @sql_string = 'alter table [' + @table_name + '] alter column [' + @column_name + '] nvarchar(' + @prec + ') ' + @nullable
	print @sql_string
	exec sp_executesql @sql_string
	if @@error <> 0
		set @errors_count = @errors_count + 1
	else
		set @modified_count = @modified_count + 1

	fetch next from colcursor into @table_name, @column_name, @type_name, @nullable, @prec
end

close colcursor
deallocate colcursor

if @errors_count <> 0
begin
	print 'Task not completed.'
	print 'See errors.'
	rollback
end
else
begin
	print 'Task completed'
	print 'Columns modified: ' + convert(varchar, @modified_count)
	rollback
end

Все бы ничего, но возникла проблема, что на некоторые текстовые поля завязаны индексы :(
Вторая проблема - поля типа text, им нельзя alter сделать.
Как лучше поступить? Поделитесь опытом, кто с таким уже сталкивался.
7 окт 04, 17:41    [1016958]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
codec
Member

Откуда: Харьков, Украина
Сообщений: 73
Еще одна заметка.
Желательно исходить из того что нет исходников базы. Тоесть вариант поудалять ручками все индексы а потом их опять создать - не катит. Их слишком много.
7 окт 04, 17:51    [1016995]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
Голенков Владимир
Member

Откуда: msk.ru
Сообщений: 441
Желательно исходить из того что нет исходников базы.

:) бд содержит все свои метаданные. какие-такие исходники?

Тоесть вариант поудалять ручками все индексы а потом их опять создать - не катит. Их слишком много.

почему ручками? скриптом. хошь-не-хошь, а придеццо
7 окт 04, 17:54    [1017005]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
codec
Member

Откуда: Харьков, Украина
Сообщений: 73
Согласен. Но нужно так чтобы скрипт сам определил нужные индексы, сам их удалил, а потом воссоздал.
Я не знаю где найти документацию по структуре метаданных чтобы написать такой скрипт.
7 окт 04, 17:59    [1017021]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
Glory
Member

Откуда:
Сообщений: 104760
Согласен. Но нужно так чтобы скрипт сам определил нужные индексы, сам их удалил, а потом воссоздал.
Я не знаю где найти документацию по структуре метаданных чтобы написать такой скрипт.

Попробуйте так
1. Создайте скрипт базы
2. В любом текстовом редакторе замените char на nchar и тд.
3. С помощью модифицированного скрипта создайте новую базу
4. С помощью DTS перенесите данные из старой базы в новую
7 окт 04, 18:09    [1017055]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
Голенков Владимир
Member

Откуда: msk.ru
Сообщений: 441
Я не знаю где найти документацию по структуре метаданных чтобы написать такой скрипт.

1) изучать BOL по темам sysindexes, sysobjects и прочие sys* по необходимости
2) полный скрипт объектов БД

ведь проблемы-то могут быть и в параметрах сохраненок, в том, что varchar хранит в 2 раза больше символов чем nvarchar
7 окт 04, 18:11    [1017062]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
Glory
Member

Откуда:
Сообщений: 104760
Еще вариант
Вытащить всю схему данных с помощью какого либо ERP программы. Возможно там есть средства для массовой замены типов столбцов. Потом получить опять же скрипт и создать новую базу
7 окт 04, 18:15    [1017076]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
codec
Member

Откуда: Харьков, Украина
Сообщений: 73
Голенков Владимир
ведь проблемы-то могут быть и в параметрах сохраненок, в том, что varchar хранит в 2 раза больше символов чем nvarchar
Я это учел.
7 окт 04, 18:17    [1017081]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
codec
Member

Откуда: Харьков, Украина
Сообщений: 73
Вопрос по полям text остается открытым.
Покачто вижу единственный способ - создание новой базы и перенос туда всех данных через DTS. Насколько он реален, еще не знаю. Дело в том что база данных расположена на 4-х серверах (хостингах) в америке и одном у нас.
7 окт 04, 18:23    [1017101]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
Я только упредить хочу: при переходе на UNICODE, как правило, мало заменить (var)char->n(var)char, text->ntext. Следует еще проверить весь код в БД на предмет соответствия. К примеру, был случай, когда поля обновили, а вот функции типа DATALENGTH оставили...
7 окт 04, 18:43    [1017154]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
Голенков Владимир
Member

Откуда: msk.ru
Сообщений: 441
Вопрос по полям text остается открытым.

можно попробовать четрез READTEXT/UPDATEXT

в случае неудачи -- внешний клиент + ADO
7 окт 04, 19:04    [1017212]     Ответить | Цитировать Сообщить модератору
 Re: Перевод базы данных на Unicode  [new]
VIK@work
Guest
Можно еще попробовать такой вариант:
1. Скрипт базы.
2. Замена char на nchar.
3. Создаете новую базу из скрипта.
4. Утилитой SQL Diff ( http://www.adeptsql.com/download.htm ) скриптуете разницу между старой и новой базой.
5. Накатываете полученый скрипт на старую базу.

Естественно, не забываем бекапится перед экспериментами :)
Удачи.
8 окт 04, 08:41    [1017661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить