Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 изменение типа данных на varchar(max)  [new]
marinad1
Guest
Есть таблица, в которой 29 столбцов типа varchar(8000). Необходимо эти столбцы сделать varchar(max), т к заказчик жалуется, что не вмещается вся инфа. MS SQL 2005 выдаёт ошибку Cannot create a row of size 8074 which is greater than the allowable maximum of 8060. Что посоветуете?
14 май 14, 16:48    [16016731]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сделать таблицу из одного поля varchar (8000).
14 май 14, 16:49    [16016739]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
конфигурация структуры БД запрещена
14 май 14, 16:52    [16016760]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
marinad1
конфигурация структуры БД запрещена
И изменение типа поля это типа не конфигурация структуры?
14 май 14, 16:53    [16016766]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
в смысле нельзя создавать новые таблицы и новые поля, можно только поменять тип данных
14 май 14, 16:54    [16016773]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
при этом на text переходить не хотелось бы
14 май 14, 16:56    [16016786]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
marinad1
Что посоветуете?
Выполнить 29 раз
alter table ... alter column ...
14 май 14, 17:06    [16016852]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
я так и делаю, спотыкается на первом же ALTER
14 май 14, 17:08    [16016860]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
marinad1,

сделайте перед изменением типа rebuild кластерного индекса.
14 май 14, 17:15    [16016890]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
сейчас попробую, спасибо
14 май 14, 17:18    [16016901]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
marinad1
я так и делаю, спотыкается на первом же ALTER
"Спотыкается" - это такое сообщение об ошибке?
14 май 14, 17:19    [16016905]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
marinad1
я так и делаю, спотыкается на первом же ALTER
Наверно еще много других столбцов, помимо этих?
14 май 14, 17:22    [16016916]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
да, помимо этих много других столбцов
14 май 14, 17:26    [16016944]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
"Спотыкается", значит выдаёт ошибку: Cannot create a row of size 8074 which is greater than the allowable maximum of 8060. Причём некоторые из этих 29 столбцов переходят на varchar(max) успешно. А в др. базе наоборот ошибка выходит совсем на др столбцах. Зависит от данных по видимому.
14 май 14, 17:30    [16016974]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
+ Способ с копированием таблицы
use tempdb;
go

create table dbo.t
(
 field0 char(7000),
 field1 varchar(8000) not null,
 field2 varchar(8000) not null,
 field3 varchar(8000) not null,
 field4 varchar(8000) not null,
 field5 varchar(8000) not null,
 field6 varchar(8000) not null,
 field7 varchar(8000) not null,
 field8 varchar(8000) not null,
 field9 varchar(8000) not null,
 field10 varchar(8000) not null,
 field11 varchar(8000) not null,
 field12 varchar(8000) not null,
 field13 varchar(8000) not null,
 field14 varchar(8000) not null,
 field15 varchar(8000) not null,
 field16 varchar(8000) not null,
 field17 varchar(8000) not null,
 field18 varchar(8000) not null,
 field19 varchar(8000) not null,
 field20 varchar(8000) not null,
 field21 varchar(8000) not null,
 field22 varchar(8000) not null,
 field23 varchar(8000) not null,
 field24 varchar(8000) not null,
 field25 varchar(8000) not null,
 field26 varchar(8000) not null,
 field27 varchar(8000) not null,
 field28 varchar(8000) not null,
 field29 varchar(8000) not null
);
go

insert into dbo.t
select top (10)
 'a',
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000),
 replicate('a', 8000);
go

/*Тут будет ошибка*/
alter table dbo.t alter column field1 varchar(max) not null;
alter table dbo.t alter column field2 varchar(max) not null;
alter table dbo.t alter column field3 varchar(max) not null;
alter table dbo.t alter column field4 varchar(max) not null;
alter table dbo.t alter column field5 varchar(max) not null;
alter table dbo.t alter column field6 varchar(max) not null;
alter table dbo.t alter column field7 varchar(max) not null;
alter table dbo.t alter column field8 varchar(max) not null;
alter table dbo.t alter column field9 varchar(max) not null;
alter table dbo.t alter column field10 varchar(max) not null;
alter table dbo.t alter column field11 varchar(max) not null;
alter table dbo.t alter column field12 varchar(max) not null;
alter table dbo.t alter column field13 varchar(max) not null;
alter table dbo.t alter column field14 varchar(max) not null;
alter table dbo.t alter column field15 varchar(max) not null;
alter table dbo.t alter column field16 varchar(max) not null;
alter table dbo.t alter column field17 varchar(max) not null;
alter table dbo.t alter column field18 varchar(max) not null;
alter table dbo.t alter column field19 varchar(max) not null;
alter table dbo.t alter column field20 varchar(max) not null;
alter table dbo.t alter column field21 varchar(max) not null;
alter table dbo.t alter column field22 varchar(max) not null;
alter table dbo.t alter column field23 varchar(max) not null;
alter table dbo.t alter column field24 varchar(max) not null;
alter table dbo.t alter column field25 varchar(max) not null;
alter table dbo.t alter column field26 varchar(max) not null;
alter table dbo.t alter column field27 varchar(max) not null;
alter table dbo.t alter column field28 varchar(max) not null;
alter table dbo.t alter column field29 varchar(max) not null;
go

select top (0) * into dbo.temp from dbo.t;
go

alter table dbo.temp alter column field1 varchar(max) not null;
alter table dbo.temp alter column field2 varchar(max) not null;
alter table dbo.temp alter column field3 varchar(max) not null;
alter table dbo.temp alter column field4 varchar(max) not null;
alter table dbo.temp alter column field5 varchar(max) not null;
alter table dbo.temp alter column field6 varchar(max) not null;
alter table dbo.temp alter column field7 varchar(max) not null;
alter table dbo.temp alter column field8 varchar(max) not null;
alter table dbo.temp alter column field9 varchar(max) not null;
alter table dbo.temp alter column field10 varchar(max) not null;
alter table dbo.temp alter column field11 varchar(max) not null;
alter table dbo.temp alter column field12 varchar(max) not null;
alter table dbo.temp alter column field13 varchar(max) not null;
alter table dbo.temp alter column field14 varchar(max) not null;
alter table dbo.temp alter column field15 varchar(max) not null;
alter table dbo.temp alter column field16 varchar(max) not null;
alter table dbo.temp alter column field17 varchar(max) not null;
alter table dbo.temp alter column field18 varchar(max) not null;
alter table dbo.temp alter column field19 varchar(max) not null;
alter table dbo.temp alter column field20 varchar(max) not null;
alter table dbo.temp alter column field21 varchar(max) not null;
alter table dbo.temp alter column field22 varchar(max) not null;
alter table dbo.temp alter column field23 varchar(max) not null;
alter table dbo.temp alter column field24 varchar(max) not null;
alter table dbo.temp alter column field25 varchar(max) not null;
alter table dbo.temp alter column field26 varchar(max) not null;
alter table dbo.temp alter column field27 varchar(max) not null;
alter table dbo.temp alter column field28 varchar(max) not null;
alter table dbo.temp alter column field29 varchar(max) not null;
go

insert into dbo.temp select * from dbo.t;
go

drop table dbo.t;
exec sp_rename 'dbo.temp', 't', 'object';
go

drop table dbo.t;
go
14 май 14, 17:36    [16017010]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
после ALTER INDEX ALL ON table_name REBUILD всё та же ошибка
14 май 14, 18:05    [16017133]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
marinad1
после ALTER INDEX ALL ON table_name REBUILD всё та же ошибка

вообще ни одного alter сделать не дает?
можно после каждых нескольких alter делать rebuild.
или через переливку в новую таблицу, как invm предложил.
14 май 14, 18:23    [16017200]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
o-o
Guest
пример, не дающий сделать ALTER ... varchar(8000) -> varchar(max), где не поможет REBUILD:

create table t (col1 char(8000), col2 char(25) primary key clustered, col3 varchar(8000));
go

insert into t (col1, col2, col3)
values ('a', 'b', replicate('c', 20));
go

ALTER INDEX ALL ON t REBUILD;
go

alter table t alter column col3 varchar(max);
---------------------------------------------------
Msg 511, Level 16, State 1, Line 1
Cannot create a row of size 8078 which is greater than the allowable maximum row size of 8060.
14 май 14, 19:07    [16017350]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Это ограничение, если не ошибаюсь, сняли только в 2012 сервере.
15 май 14, 11:47    [16020020]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Видимо, ошибаюсь :) Может в 2014? На поля типа varchar(), с которыми длина записи превосходит ограничение.
15 май 14, 11:49    [16020038]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Владислав Колосов
Видимо, ошибаюсь :) Может в 2014? На поля типа varchar(), с которыми длина записи превосходит ограничение.


вы наверно путаете ситуацию, когда до 2012-ого можно было добавить столбцы, а потом получить ошибку в процессе работы и таблица вообще становится недоступной...

начиная с 2012-ого мы при попытке добавить столбец сразу получим исключение...т.к. сразу идёт проверка на то, что все строки помещаются на странице
15 май 14, 11:57    [16020104]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
т е всё таки выход один, перевести всё в text?
15 май 14, 13:11    [16020705]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
marinad1
т е всё таки выход один, перевести всё в text?


text - это тот же varchar(max), только с ограниченной функциональностью. оставлен для обратной совместимости.

нет, ну через заливку в новую таблицу-то уж точно должно получиться. с этим какие-то проблемы?
15 май 14, 13:29    [16020890]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
marinad1
Guest
боюсь данные потерять через заливку
15 май 14, 13:34    [16020929]     Ответить | Цитировать Сообщить модератору
 Re: изменение типа данных на varchar(max)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
marinad1
боюсь данные потерять через заливку
Это как это "потерять через заливку"?
15 май 14, 13:54    [16021076]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить