Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите вставить NULL / 14 сообщений из 14, страница 1 из 1
22.05.2020, 13:02
    #39960682
olkir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
Приветствую, задача такая, есть таблица:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table dbo.ELARDocs  
(  
 XRecID int identity(1,1) primary key not null,  
 uploadDate datetime not null,
 docID int not null,  
 rccID int null default null,  
 verID int not null,
 docGUID varchar(255) not null,
 refName varchar(255) null default null,
 taskIDs varchar(1024) null default null
);  



Используемое приложение делает вставку в эту таблицу данные, проблема в том, что иногда в поля rccID , refName и taskIDs
могут передаваться пустые строки, в результате, после insert-а, в поле rccID пишется 0, в полях refName и taskIDs - пустота, а мне нужно, чтобы в этих полях стоял NULL.
Пробовал у этих полей в объявлении таблицы ставить "default null" (как в моем примере) - не помогает.

Так же попробовал написать триггер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create trigger ELARDocsInsert
on ELARDocs instead of insert
as begin
	insert into ELARDocs (uploadDate, docID, rccID, verID, docGUID, refName, taskIDs)
	select [uploadDate], [docID],
		case rccID when 0 then null 
			-- when rccID = '' then null
		end,
		verID,
		docGUID,
		case refName when '' then null end,
		case taskIDs when '' then null end
	from inserted
end


Но в этом случае SQL Server ругается на case:
Код: sql
1.
None of the result expressions in a CASE specification can be NULL.  



Что можно сделать? Т.е нужно, чтобы, если пишем в эти три поля '' или 0, то в них должно быть именно NULL, а не 0 или пустота.
...
Рейтинг: 0 / 0
22.05.2020, 13:05
    #39960685
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
olkir,

не дочитали справку по синтаксису по CASE, там есть еще и else.
...
Рейтинг: 0 / 0
22.05.2020, 13:14
    #39960691
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
olkir,

Код: sql
1.
 rccID int null default null

, это новые веяния в дизайне БД?

Лучше используйте NULLIF(field, 0)
...
Рейтинг: 0 / 0
22.05.2020, 13:17
    #39960694
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
Владислав Колосов
olkir,

не дочитали справку по синтаксису по CASE, там есть еще и else.


Если ELSE вообще не писать, то будет => ELSE NULL
...
Рейтинг: 0 / 0
22.05.2020, 13:21
    #39960696
olkir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
Владислав Колосов,

О, точно, заработало )
Можно ещё вопрос, почему на одну вставку, сервер обрабатывает каких-то две(?) строки, т.е он возвращает

Код: sql
1.
2.
3.
4.
5.
(затронута одна строка)

(затронута одна строка)

Время выполнения: 2020-05-22T15:18:06.8091147+05:00


Откуда два раза вот эта раза про одну строку? для примера инсерт делал такой:

Код: sql
1.
2.
-- т.е у меня тут 3 пустых поля и я ожидал, что будет затронута либо 1 строка, либо 3(по одной на каждый пустой параметр)
insert into ELARDocs values(getdate(), '3347676', '', '15854873', '91d97c33-a163-4d31-b9de-10564f6ff299', '', '' )



И ещё вопрос, здесь без триггера не обойтись?
...
Рейтинг: 0 / 0
22.05.2020, 13:26
    #39960700
olkir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
a_voronin,

Это я пробовал разные варианты, думал что если в поле пустота, то там по умолчанию подставляется null... не подставляется (

NULLIF(field, 0)
Её так же в case надо использовать?
...
Рейтинг: 0 / 0
22.05.2020, 13:37
    #39960707
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
olkir
a_voronin,

Это я пробовал разные варианты, думал что если в поле пустота, то там по умолчанию подставляется null... не подставляется (

NULLIF(field, 0)

Её так же в case надо использовать?

"А Кока-Колу надо пить до или после?", вместо, Голубушка, вместо.
...
Рейтинг: 0 / 0
22.05.2020, 14:22
    #39960730
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
olkir,

напишите в триггере SET NOCOUNT ON.
...
Рейтинг: 0 / 0
22.05.2020, 14:23
    #39960732
olkir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
a_voronin,
Понял, но опять же, она подойдёт если у нас одно условие проверки, а если нужно проверить и на 0 и на '', использовать условие или можно по OR соединить, типа:
Код: sql
1.
select uploadDate, docID,  (NULLIF(field, 0) or NULLIF(field, ''))... 


from...

типа так?
...
Рейтинг: 0 / 0
22.05.2020, 14:29
    #39960735
olkir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
Владислав Колосов,

Добавил, спасибо )
...
Рейтинг: 0 / 0
22.05.2020, 14:37
    #39960742
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
olkir
a_voronin,
Понял, но опять же, она подойдёт если у нас одно условие проверки, а если нужно проверить и на 0 и на '', использовать условие или можно по OR соединить, типа:
Код: sql
1.
select uploadDate, docID,  (NULLIF(field, 0) or NULLIF(field, ''))... 

Во первых, 0 или '' не может быть, может быть только '0' или ''

Во вторых, я даже не знаю, как можно написать выражение NULLIF(field, 0) or NULLIF(field, '') ???

Нужно просто сделать вложенный NULLIF
Код: sql
1.
select uploadDate, docID,  NULLIF(NULLIF(field, '0'), ''))... 



ИМХО, это лучше CASE
...
Рейтинг: 0 / 0
22.05.2020, 14:46
    #39960748
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
alexeyvg
olkir
a_voronin,
Понял, но опять же, она подойдёт если у нас одно условие проверки, а если нужно проверить и на 0 и на '', использовать условие или можно по OR соединить, типа:
Код: sql
1.
select uploadDate, docID,  (NULLIF(field, 0) or NULLIF(field, ''))... 

Во первых, 0 или '' не может быть, может быть только '0' или ''

Во вторых, я даже не знаю, как можно написать выражение NULLIF(field, 0) or NULLIF(field, '') ???

Нужно просто сделать вложенный NULLIF
Код: sql
1.
select uploadDate, docID,  NULLIF(NULLIF(field, '0'), ''))... 



ИМХО, это лучше CASE


Если посмотреть на исходный пример триггера, то имелось ввиду

Код: sql
1.
2.
3.
		case rccID when 0 then null  end => NULLIF(rccID, 0)

		case refName when '' then null end => NULLIF(refName , '')
...
Рейтинг: 0 / 0
22.05.2020, 14:46
    #39960749
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
alexeyvg,
чуть короче, а так кому что удобнее читать

Код: sql
1.
2.
3.
select uploadDate, docID,  NULLIF(NULLIF(field, '0'), ''))... 

select uploadDate, docID, case when field not in ( '0', '') then field end
...
Рейтинг: 0 / 0
23.05.2020, 01:08
    #39960961
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вставить NULL
StarikNavy,

Спасибо, не знал этих приёмов. Вопрос решен )
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите вставить NULL / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]