Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DEFAULT НА NULL  [new]
молоко с вопросом
Guest
Всем доброго времени суток!
С толкнулся с такой ситуацией:
таблица table1
столбцы name, code, n_code

А | 422 | 34
М | 344 | 32
М | 422 | NULL
В | 123 | NULL

таблица table2
столбцы name, code

добавляю в table 1 две нижние строки из table2, т.к. во второй таблице нет столбца n_code, добавляю его и заполняю NULL, что бы после добавить

INSERT INTO table1
select name, code, n_code
from
(
select name, code, null as n_code
from table2
)x

n_code в table1 имеет значение по умолчанию '30'
нужна на выходе таблица без NULL
возможно ли мне NULL теперь заменить на значение по умолчанию DEFAULT. как это сделать? пожалуйста помогите
5 июн 13, 15:53    [14395409]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
INSERT INTO table1
select name, code, n_code
from
(
select name, code, '30' as n_code
from table2
)x
5 июн 13, 15:55    [14395423]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
INSERT INTO table1 (name, code)
select name, code
from
(
select name, code
from table2
)x
 
5 июн 13, 15:55    [14395433]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
молоко с вопросом
возможно ли мне NULL теперь заменить на значение по умолчанию DEFAULT. как это сделать? пожалуйста помогите
UPDATE

Хотя проще было сразу вставить с DEFAULT, непонятно, заечм вставлять NULL, а потом менять.
5 июн 13, 15:55    [14395434]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
молоко с вопросом
Guest
Konst_One
INSERT INTO table1 (name, code)
select name, code
from
(
select name, code
from table2
)x
 


когда пропускаю столбец выдает ошибку, что столбца не хватает
-----
Паганель
INSERT INTO table1
select name, code, n_code
from
(
select name, code, '30' as n_code
from table2
)x


могу ли я вместо '30' как то прописать default? что бы автоматически ставилось значение по умолчанию
5 июн 13, 16:07    [14395516]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
молоко с вопросом
Konst_One
INSERT INTO table1 (name, code)
select name, code
from
(
select name, code
from table2
)x
 


когда пропускаю столбец выдает ошибку, что столбца не хватает
-----

значит у вас нет default constraint для этого поля
5 июн 13, 16:08    [14395525]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
молоко с вопросом
могу ли я вместо '30' как то прописать default? что бы автоматически ставилось значение по умолчанию
нет
5 июн 13, 16:12    [14395569]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
молоко с вопросом
Guest
INSERT INTO table1 (name, code, n_code) 
VALUES ('M', 422, DEFAULT);

если я делал бы таким образом, DEFAULT работает
дело в том, что хочу найти способ для больших таблиц
--
я могу UPDATE связать в одном запросе с INSERT?
5 июн 13, 16:29    [14395746]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
молоко с вопросом
я могу UPDATE связать в одном запросе с INSERT?

Можно, при помощи команды MERGE
5 июн 13, 16:42    [14395853]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
use tempdb;
go

create table #t1 (a int not null, b int not null, c int not null default 0);
create table #t2 (a int not null, b int not null, c int not null);
go

insert into #t1
 (a, b)
values
 (1, 1), (2, 2);
 
declare @s1 varchar(max), @s2 varchar(max), @dn sysname = cast(newid() as sysname);

select
 @s1 = 'alter table #t2 add constraint ' + quotename(@dn) + ' default ' + dc.definition + ' for c;',
 @s2 = 'alter table #t2 drop constraint ' + quotename(@dn) + ';'
from
 sys.default_constraints dc join
 sys.columns sc on sc.object_id = dc.parent_object_id and sc.column_id = dc.parent_column_id
where
 dc.parent_object_id = object_id('tempdb..#t1', 'U') and
 sc.name = 'c';

begin tran;

exec(@s1);

insert into #t2
 (a, b)
 select
  a, b
 from
  #t1;

select * from #t1;  
select * from #t2;  

exec(@s2);

rollback;
go
 
drop table #t1, #t2;
go
5 июн 13, 17:41    [14396231]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Способ №2:
use tempdb;
go

create table #t1 (a int not null, b int not null, c int not null default 0);
create table #t2 (a int not null, b int not null, c int not null);
go

insert into #t1
 (a, b)
values
 (1, 1), (2, 2);
 
declare @s1 varchar(max), @s2 varchar(max), @dn sysname = cast(newid() as sysname);

select
 @s1 = dc.definition
from
 sys.default_constraints dc join
 sys.columns sc on sc.object_id = dc.parent_object_id and sc.column_id = dc.parent_column_id
where
 dc.parent_object_id = object_id('tempdb..#t1', 'U') and
 sc.name = 'c';

begin tran;

exec('
insert into #t2
 (a, b, c)
 select
  a, b, ' + @s1 + '
 from
  #t1;
');

select * from #t1;  
select * from #t2;  

rollback;
go
 
drop table #t1, #t2;
go
5 июн 13, 17:54    [14396321]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
молоко с вопросом
Guest
всем спасибо за помощь, попробую разобраться
6 июн 13, 08:40    [14397777]     Ответить | Цитировать Сообщить модератору
 Re: DEFAULT НА NULL  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3789
молоко с вопросом
INSERT INTO table1 (name, code, n_code) 
VALUES ('M', 422, DEFAULT);

если я делал бы таким образом, DEFAULT работает
дело в том, что хочу найти способ для больших таблиц
--
я могу UPDATE связать в одном запросе с INSERT?

для больших таблиц ничего из вышеперечисленного не работает.
Там в 2008 сервере делается так (в 2012 наконец что-то поменялось)
1. Добавляется к большой таблице NULL поле. (Если добавить NOT NULL поле в очень большую таблицу - лог просто умрет)
2. Апдейтится поле нужным значинием с батчингом. То есть небольшими частями (по 10-20 миллионов строк)
3. Поле меняется на NOT NULL если надо. Опять же если надо можно добавить и дефолт констрейнт.
6 июн 13, 12:12    [14399074]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить