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

Откуда: Київ
Сообщений: 10428
Как вставлять значения по умолчанию, если идет нулл?

declare	@xmltable TABLE 
(	
	pageSize			int	NULL DEFAULT 100,
	startRecordIndex	int	NULL DEFAULT 0
)

insert into @xmltable(pageSize)
SELECT NULL
select * from @xmltable

insert into @xmltable(pageSize,startRecordIndex)
SELECT NULL, NULL
select * from @xmltable


Это упрощенно, в реалии я читаю из xml переменной, там могут отсутствовать значения или быть пустыми типа такого, а insert перечисляет все поля

<node>
<pageSize></pageSize>
<startRecordIndex>12</startRecordIndex>
</node>


или

<node>
<pageSize></pageSize>
</node>
27 авг 15, 12:19    [18075637]     Ответить | Цитировать Сообщить модератору
 Re: INSERT: Как добавить default значения в поля?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21055
https://msdn.microsoft.com/en-us/library/dd776381(v=sql.105).aspx
27 авг 15, 12:26    [18075686]     Ответить | Цитировать Сообщить модератору
 Re: INSERT: Как добавить default значения в поля?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Akina
https://msdn.microsoft.com/en-us/library/dd776381(v=sql.105).aspx


не нашел там решения, для того, чтобы использовались значения default надо не указывать поле в insert.

Но при чтении из xml я не знаю чтотам будет пустым или отсутствовать, потмоу надо перечислять все поля в инсерте

declare	@xmltable TABLE 
(	
	pageSize			int	NULL DEFAULT 100,
	startRecordIndex	int	NULL DEFAULT 0
)
declare @parameters nvarchar(1024)

set @parameters = 
N'<row>
  <pageSize></pageSize>
  <startRecordIndex>100</startRecordIndex>
</row>'

DECLARE @xml xml
begin try
	SET @xml = cast(@parameters as xml)
end try
begin catch
	select error_message();
end catch

select @parameters, @xml

insert into @xmltable(pageSize,startRecordIndex)
SELECT
doc.col.value('pageSize[1]', 'int')	pageSize
,doc.col.value('startRecordIndex[1]', 'int') startRecordIndex
FROM @xml.nodes('/row') doc(col)

select * from @xmltable
27 авг 15, 12:34    [18075750]     Ответить | Цитировать Сообщить модератору
 Re: INSERT: Как добавить default значения в поля?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21055
Winnipuh
при чтении из xml я не знаю чтотам будет пустым или отсутствовать, потмоу надо перечислять все поля в инсерте
А что мешает использовать вульгарный IF и в зависимости от того, NULL или не очень, выполнять тот или иной запрос?
27 авг 15, 13:03    [18075998]     Ответить | Цитировать Сообщить модератору
 Re: INSERT: Как добавить default значения в поля?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Akina
Winnipuh
при чтении из xml я не знаю чтотам будет пустым или отсутствовать, потмоу надо перечислять все поля в инсерте
А что мешает использовать вульгарный IF и в зависимости от того, NULL или не очень, выполнять тот или иной запрос?


Да, конечно, как-то так и придется делать, но тяга к знаниями иногда не дает покоя
27 авг 15, 13:20    [18076188]     Ответить | Цитировать Сообщить модератору
 Re: INSERT: Как добавить default значения в поля?  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
Winnipuh
но тяга к знаниями иногда не дает покоя
Лекарство для успокоения:
use tempdb;
go

create table dbo.t (id int, v1 int null default 1, v2 varchar(100) null default 'a', v3 datetime null default '20150101');
go

create table dbo.#defaults (dummy int);

declare @s varchar(max);

select
 @s = (
  select
   'alter table #defaults add ' + quotename(c.name) + ' sql_variant default ' + definition
  from
   sys.default_constraints dc join
   sys.columns c on c.object_id = dc.parent_object_id and c.column_id = dc.parent_column_id
  where
   parent_object_id = object_id('dbo.t', 'U')
  for xml path(''), type
 ).value('.', 'varchar(max)');

exec(@s);
insert into #defaults default values;
go

insert into dbo.t
 (id, v1, v2, v3)
select
 a.id,
 isnull(a.v1, cast(d.v1 as int)),
 isnull(a.v2, cast(d.v2 as varchar(100))),
 isnull(a.v3, cast(d.v3 as datetime))
from
 (values (1, null, null, null)) a(id, v1, v2, v3) cross join
 #defaults d;
go

select * from dbo.t;
go

drop table dbo.t, #defaults;
go
27 авг 15, 13:30    [18076282]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить