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

Откуда: Казань
Сообщений: 507
Кто может объяснить, почему получаю разный результат по одной и той же строке таблицы (от ANSI_PADDING OFF отказаться нельзя) :
-- создание таблицы с ansi_padding off
set ansi_padding off
GO
create table #t (a char(3) null)
GO
set ansi_padding on
GO
insert #t values ('1')
GO
-- 1 запрос
select a+'!' 
from(
select a from #t
union all
select '2'
) b
-- 2 запрос
select a+'!' from #t

Результат :

----
1 !
2!

(2 row(s) affected)


----
1!

(1 row(s) affected)

30 ноя 16, 08:31    [19949837]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Даутов
Member

Откуда: Казань
Сообщений: 507
SQL Server 2014 SP2
30 ноя 16, 08:32    [19949840]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Даутов
Member

Откуда: Казань
Сообщений: 507
В обоих случаях ожидался результат 1!
30 ноя 16, 08:37    [19949845]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Mike_za
Member

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

Чем char от varchar отличается в курсе?
Поменяйте тип))
30 ноя 16, 08:46    [19949860]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Этот параметр влияет только на определение новых столбцов. После создания столбца SQL Server сохраняет значения, исходя из значения параметра на время создания столбца. Более поздние изменения этого параметра не влияют на существующие столбцы.
30 ноя 16, 08:52    [19949878]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Даутов
Member

Откуда: Казань
Сообщений: 507
Mike_za,
тип поля в таблице менять нельзя,
Нельзя менять null и not null.
Нельзя менять set ansi_padding.
Это исходные условия.

При этих исходных условиях ожидался одинаковый результат в обоих запросах
30 ноя 16, 08:54    [19949882]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Я про это...
[src]
-- 1 запрос
select a+'!'
from(
select a from #t
union all
select cast('2' as char(3))
) b
-- 2 запрос
select a+'!' from #t
30 ноя 16, 09:00    [19949899]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Даутов
Member

Откуда: Казань
Сообщений: 507
Mike_za
Я про это...
[src]
-- 1 запрос
select a+'!'
from(
select a from #t
union all
select cast('2' as char(3))
) b
-- 2 запрос
select a+'!' from #t


Это не дает одинаковый результат для строки со значением 1
30 ноя 16, 09:10    [19949920]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
И вот это:


select * into #b from (

select a from #t
union all
select '2'
)x
select * from tempdb.sys.columns where object_id = object_id('tempdb..#t')
select * from tempdb.sys.columns where object_id = object_id('tempdb..#b')
30 ноя 16, 09:14    [19949929]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
MaxusPerfectus
Member

Откуда: Москва
Сообщений: 11
-- С пробелами
select a+'!'
from(
	select a from #t
	union all
	select cast('2' as char(3))
) b;
select cast(a as char(3))+'!' from #t;

-- Без пробелов
select rtrim(a)+'!'
from(
	select a from #t
	union all
	select '2'
) b;
select a+'!' from #t;

Здесь a приводится к типу varchar и заполняется пробелами до длины 3
select a from #t
union all
select '2'
30 ноя 16, 10:24    [19950105]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
MaxusPerfectus
-- С пробелами
select a+'!'
from(
	select a from #t
	union all
	select cast('2' as char(3))
) b;
select cast(a as char(3))+'!' from #t;

-- Без пробелов
select rtrim(a)+'!'
from(
	select a from #t
	union all
	select '2'
) b;
select a+'!' from #t;

Здесь a приводится к типу varchar и заполняется пробелами до длины 3
select a from #t
union all
select '2'

это описали что деалет сиквел, да, символ ! не понятно какого типа , а почему он это не сделал в 1 запросе?!
посмотрите план, какие там операции.
30 ноя 16, 11:05    [19950251]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
daw
Member

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

по-видимому, union трактуется здесь как создание таблицы.
я бы сказал, что это баг. но править его не будут: "We recommend that ANSI_PADDING always be set to ON."
30 ноя 16, 11:14    [19950314]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
могу, кстати, еще в копилочку подкинуть:
не работают строковые функции в ХП
это не то же, что в данной теме описано, но показывает, что с ansi_padding не все обстоит ровно так, как в документации описано.
30 ноя 16, 11:21    [19950379]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
daw
Даутов,

по-видимому, union трактуется здесь как создание таблицы.
я бы сказал, что это баг. но править его не будут: "We recommend that ANSI_PADDING always be set to ON."

шозабред
union конвертирует в зависимости от приоритета типа https://msdn.microsoft.com/en-us/library/ms190309.aspx
т.е. char и varchar всегда в union даст последний
30 ноя 16, 11:24    [19950412]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
daw
Member

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

по-видимому, union трактуется здесь как создание таблицы.
я бы сказал, что это баг. но править его не будут: "We recommend that ANSI_PADDING always be set to ON."

шозабред
union конвертирует в зависимости от приоритета типа https://msdn.microsoft.com/en-us/library/ms190309.aspx
т.е. char и varchar всегда в union даст последний


и что с того? при ansi_padding on (при котором выполняется запрос)
Trailing blanks in character values inserted into varchar columns are not trimmed. Trailing zeros in binary values inserted into varbinary columns are not trimmed. Values are not padded to the length of the column.

вот так результат уже другой будет:
-- создание таблицы с ansi_padding off
set ansi_padding off
GO
create table #t (a char(3) null)
GO
set ansi_padding on
GO
insert #t values ('1')
go
set ansi_padding off;
go
-- 1 запрос
select a + '!' 
from(
select a from #t 
union all
select '2'
) b
-- 2 запрос
select a+'!'  from #t
go
drop table #t


ах, да, еще вот что: char - он, на самом деле, на уровне хранения, всегда добивается пробелами до нужной длины, не зависимо от того, какая была настройка ansi_padding при создании таблицы. кто не верит, может воспользоваться dbcc page.
30 ноя 16, 11:31    [19950457]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
В будущей версии Microsoft SQL Server параметр ANSI_PADDING всегда будет иметь значение ON, а любые приложения, явно устанавливающие значение параметра равным OFF, приведут к ошибке.
Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

Делайте выводы, настройка неоднозначно влияет на поведение, поэтому устраняют.
30 ноя 16, 11:40    [19950511]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
Даутов
Member

Откуда: Казань
Сообщений: 507
Владислав Колосов
В будущей версии Microsoft SQL Server параметр ANSI_PADDING всегда будет иметь значение ON, а любые приложения, явно устанавливающие значение параметра равным OFF, приведут к ошибке.
Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

Делайте выводы, настройка неоднозначно влияет на поведение, поэтому устраняют.


А что будет с полями в существующих таблицах, у которых в момент создания было SET ANSI_PADDING OFF ?

Кстати, сейчас при alter table свойство поля TrimTrailingBlanks меняется с Yes на No (для полей с Yes) при любой установке SET ANSI_PADDING в соединении.
30 ноя 16, 11:53    [19950584]     Ответить | Цитировать Сообщить модератору
 Re: Разный результат при запросе одной и той же строки таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Даутов
А что будет с полями в существующих таблицах, у которых в момент создания было SET ANSI_PADDING OFF ?
Наверно, в этом случае не удастся вот так просто перейти на новую версию сервера.
30 ноя 16, 11:56    [19950608]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить