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

Откуда:
Сообщений: 1197
вот есть такой простой сркрипт

set ansi_warnings off;
declare @t table (names nvarchar, id int)
declare @t2 table (names nvarchar, id int)


insert @t values ('aaa', 0)
insert @t2 values ('aaa', 1)
insert @t2 values ('aaa', 32)
insert @t values (NULL, 2)
insert @t2 values (NULL, 3)
insert @t values ('aaa', 4)
insert @t2 values (NULL, 5)

select * from @t t1 
 join  @t2 t2 
 on t1.names = t2.names
order by (2) desc, (4) desc



2 вопроса.
1. запрос
select * from @t2 where names <> 'aa' 
не возвращает NULL. Я так понимаю, что NULL так работает всегда и тут нет никаих флагов типа SET ANSI_WARNINGS OFF. Верно?

2. Join по 2 столбцам в которых NULL тоже всегда вернет пустое множество независимо от настроек и флагов сервера?
1 ноя 12, 16:05    [13409718]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
relief,

NVARCHAR = NVARCHAR(1)
1 ноя 12, 16:06    [13409727]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
не возвращает NULL. Я так понимаю, что NULL так работает всегда и тут нет никаих флагов типа SET ANSI_WARNINGS OFF. Верно?

SET ANSI_NULLS
Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values.


relief
Join по 2 столбцам в которых NULL тоже всегда вернет пустое множество независимо от настроек и флагов сервера?

Да
1 ноя 12, 16:09    [13409751]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
relief,

и для юникода пишите N'aaa'. Во избежание так сказать...
1 ноя 12, 16:12    [13409776]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
relief
1. запрос
select * from @t2 where names <> 'aa'
не возвращает NULL.
SELECT *
FROM @t2
WHERE NOT EXISTS(SELECT names INTERSECT SELECT N'aa');
1 ноя 12, 16:15    [13409807]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
не возвращает NULL. Я так понимаю, что NULL так работает всегда и тут нет никаих флагов типа SET ANSI_WARNINGS OFF. Верно?

SET ANSI_NULLS
Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values.




Glory,

смотрите.
установка SET ANSI_NULLS в любое положение не влияет на результат
select * from @t2 where names <> 'aa'


т.е. NULL никогда не вернется. т.е. если надо еще получить NULL, то надо явно прописать IS NULL ?
1 ноя 12, 16:26    [13409933]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
Glory
Member

Откуда:
Сообщений: 104760
SET ANSI_NULLS OFF
GO

declare @t table (names nvarchar(50), id int)
declare @t2 table (names nvarchar(50), id int)
declare @x nvarchar(50)
set @x = N'aa'

insert @t values (N'aaa', 0)
insert @t2 values (N'aaa', 1)
insert @t2 values ('aaa', 32)
insert @t values (NULL, 2)
insert @t2 values (NULL, 3)
insert @t values (N'aaa', 4)
insert @t2 values (NULL, 5)

select * from @t2 where names <> @x
1 ноя 12, 16:31    [13409985]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
SET ANSI_NULLS OFF
GO

declare @t table (names nvarchar(50), id int)
declare @t2 table (names nvarchar(50), id int)
declare @x nvarchar(50)
set @x = N'aa'

insert @t values (N'aaa', 0)
insert @t2 values (N'aaa', 1)
insert @t2 values ('aaa', 32)
insert @t values (NULL, 2)
insert @t2 values (NULL, 3)
insert @t values (N'aaa', 4)
insert @t2 values (NULL, 5)

select * from @t2 where names <> @x


Какое то колдовство.
Объясните почему в случае с переменной выводит NULL?
1 ноя 12, 17:03    [13410263]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
Glory
Member

Откуда:
Сообщений: 104760
Хелп не пробовали читать ?

SET ANSI_NULLS ON affects a comparison only if one of the operands of the comparison is either a variable that is NULL or a literal NULL. If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.
1 ноя 12, 17:06    [13410278]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
Хелп не пробовали читать ?

SET ANSI_NULLS ON affects a comparison only if one of the operands of the comparison is either a variable that is NULL or a literal NULL. If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.


выглядит как костыль.
иначе не могу объяснить почему зависит от того переменная или литерал
1 ноя 12, 17:30    [13410453]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
выглядит как костыль.
иначе не могу объяснить почему зависит от того переменная или литерал

Это для тех, кто не умеет "ходить" по правилам ISO

Скоро
In a future version of SQL Server, ANSI_NULLS will always be ON and any applications that explicitly set the option to OFF will generate an error. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

и все, кто не соблюдает троичную логику, останутся и без него.
1 ноя 12, 17:40    [13410516]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
выглядит как костыль.
иначе не могу объяснить почему зависит от того переменная или литерал

Это для тех, кто не умеет "ходить" по правилам ISO

Скоро
In a future version of SQL Server, ANSI_NULLS will always be ON and any applications that explicitly set the option to OFF will generate an error. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

и все, кто не соблюдает троичную логику, останутся и без него.


т.е. надо взять за правило, что если надо делать проверку <> 'a' и при этом включать NULL, то всегда писать еще IS NULL дополнителньо к <> 'a' ?
1 ноя 12, 17:44    [13410536]     Ответить | Цитировать Сообщить модератору
 Re: пара вопросов по языку  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
т.е. надо взять за правило, что если надо делать проверку <> 'a' и при этом включать NULL, то всегда писать еще IS NULL дополнителньо к <> 'a' ?

Надо взять за правило, что NULL-ы нужно использовать правильно
Если клиента не различает NULL-ы, то зачем они вообще используются ?
1 ноя 12, 17:57    [13410614]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить