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

Откуда:
Сообщений: 100
Есть поле в таблице. В нем хранится текст. Первый и последний символы - пробелы (ascii возвращает 32).
Столкнулся с такой проблемой.
Считываю значение из базы в приложение, а потом удаляю это значение по условию where column = @myValue. Никаких тримов не делаю и на удаление приходит значение с обеими пробелами.
Открыл для себя, что эта конструкция не работает.
Как удалить запись если процедуру удаления, я менять не могу?
18 дек 14, 14:53    [17017417]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
rinat mergenbaev
Открыл для себя, что эта конструкция не работает.

Работает

rinat mergenbaev
Как удалить запись если процедуру удаления, я менять не могу?

Удалять не через процедуру
18 дек 14, 14:56    [17017456]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
rinat mergenbaev
Member

Откуда:
Сообщений: 100
Glory,

если пока исходить из того, что процедуру менять не могу и должен ее вызывать.
а что я не так делаю если у меня не удаляет?
18 дек 14, 14:57    [17017472]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
rinat mergenbaev
а что я не так делаю если у меня не удаляет?

Это конкурс "Угадай, что я делаю" ?
18 дек 14, 14:58    [17017478]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
rinat mergenbaev,

непонятное объяснение.
какого типа поле и куда считываете до удаления, если в переменную, то какого она типа?
@myValue -- параметр той самой процедуры? какого типа этот параметр?
18 дек 14, 14:59    [17017488]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
rinat mergenbaev
Member

Откуда:
Сообщений: 100
o-o
rinat mergenbaev,

непонятное объяснение.
какого типа поле и куда считываете до удаления, если в переменную, то какого она типа?
@myValue -- параметр той самой процедуры? какого типа этот параметр?


поле в базе типа VARCHAR(30).
Считываю в C# в переменную типа String с помощью Linq.
Потом передаю в процедуру в виде параметра VARCHAR(30)
18 дек 14, 15:03    [17017524]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
rinat mergenbaev
o-o
rinat mergenbaev,

непонятное объяснение.
какого типа поле и куда считываете до удаления, если в переменную, то какого она типа?
@myValue -- параметр той самой процедуры? какого типа этот параметр?


поле в базе типа VARCHAR(30).
Считываю в C# в переменную типа String с помощью Linq.
Потом передаю в процедуру в виде параметра VARCHAR(30)
VARCHAR() - хвостовые пробелы отбрасываются и не учитываются при сравнении.
18 дек 14, 15:07    [17017560]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
rinat mergenbaev
Member

Откуда:
Сообщений: 100
iap,

насколько я вижу, что хвостовые пробелы отбрасываются только у переменной VARCHAR. А в самой таблице у значения, когда оно сравнивается, то не отбрасываются.

получается, что надо процедуру менять только?
18 дек 14, 15:33    [17017755]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
rinat mergenbaev
получается, что надо процедуру менять только?

Можете поменять данные в таблицы
Наверняка эти хвостовые пробелы в полях - просто баг создателя таблицы
18 дек 14, 15:37    [17017780]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
rinat mergenbaev
А в самой таблице у значения, когда оно сравнивается, то не отбрасываются.
Пример покажите.
18 дек 14, 15:38    [17017787]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Напишите другую процедуру, которая заменяет некорректную.
18 дек 14, 15:48    [17017839]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
rinat mergenbaev
насколько я вижу, что хвостовые пробелы отбрасываются только у переменной VARCHAR. А в самой таблице у значения, когда оно сравнивается, то не отбрасываются.

нет, они не отбрасываются ни в переменной, ни в таблице.
зато они не учитываются при сравнении.
т.е. по идее у вас, наоборот, должно было удалиться, и может даже больше чем надо

К сообщению приложен файл. Размер - 30Kb
18 дек 14, 15:51    [17017863]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
нет, они не отбрасываются ни в переменной, ни в таблице.

Они очень сильно зависят от SET ANSI_PADDING
18 дек 14, 15:54    [17017882]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
предлагаю проверить SELECT-ом ровно то, что собрались удалять:
where column = @myValue
поди строки-то есть, а не удаляет, т.к. там триггер, молча не дающий удалить
18 дек 14, 15:57    [17017905]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
Glory
o-o
нет, они не отбрасываются ни в переменной, ни в таблице.

Они очень сильно зависят от SET ANSI_PADDING

не буду приводить 2 картинки, но я в своем коде первой строкой дописываю по очереди:
SET ANSI_PADDING on;
SET ANSI_PADDING off;
а результат все тот же.
или надо таблицу при одном SET заполнить, а запрос при другом писать?
18 дек 14, 16:01    [17017929]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
не буду приводить 2 картинки, но я в своем коде первой строкой дописываю по очереди:
SET ANSI_PADDING on;
SET ANSI_PADDING off;
а результат все тот же.
или надо таблицу при одном SET заполнить, а запрос при другом писать?

http://msdn.microsoft.com/ru-ru/library/ms187403.aspx - пример в конце статьи
18 дек 14, 16:07    [17017972]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
Glory,
пример по ссылке получился, а с переменной @t table что-то не то, не пойму что
SET ANSI_PADDING OFF;

declare @t table (id int, col_varchar varchar(30), col_char char(30));
insert into @t (id, col_varchar, col_char)
values (0, 'a', 'a'), (1, 'a' + CHAR(32), 'a' + CHAR(32)), 
       (6, 'a      ', 'a      ');

select id, col_varchar + '*' as col_varchar, col_char + '*' as col_char
from @t;

declare @v1 varchar(30), @v6 varchar(30);

select @v1 = col_varchar
from @t
where id = 1;

select @v6 = col_varchar
from @t
where id = 6;

select @v1 + '*' as [@v1 + '*'], @v6 + '*' as [@v6 + '*'];

select *
from @t
where col_varchar = @v6;       


К сообщению приложен файл. Размер - 34Kb
18 дек 14, 16:34    [17018166]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
а с переменной @t table что-то не то, не пойму что

Наверное то, что она сначала переменная, а потом уже таблица
18 дек 14, 16:41    [17018218]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
Glory,
я, конечно, сегодня торможу, но кто тут сперва переменная, а потом таблица?
и какая разница между 5 и 6?
SET ANSI_PADDING Off;

declare @t table (id int, col_varchar varchar(30));
insert into @t (id, col_varchar)
values (5, 'a     '), 
       (6, 'a      '),
       (5, 'a     ')
;

select id, col_varchar + '*' as col_varchar
from @t;


К сообщению приложен файл. Размер - 14Kb
18 дек 14, 17:24    [17018513]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
я, конечно, сегодня торможу, но кто тут сперва переменная, а потом таблица?

Я тоже не понимаю, что вам непонятно.
Все пробелы в переменных и таблицах ведут себя так, как это описанов хелпе
18 дек 14, 17:28    [17018535]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
o-o
Guest
Glory,

Setting OFF: Trailing blanks in character values inserted into a varchar column are trimmed.
колонка у меня varchar(30), вставляю с шестью пробелами. Trailing blanks are trimmed -- не вижу.
с 5-ю вижу, ок, но при чем тут 6?
честно не понимаю.
где еще прочитать?
18 дек 14, 17:40    [17018594]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
честно не понимаю.

Чего не понимаете то ?
усечение пробелов в каждом символьном или бинаронм поле определяется установкой SET ANSI_PADDING в момент создания/изменения этого поля.
18 дек 14, 17:43    [17018614]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Yasha123
Member

Откуда:
Сообщений: 1973
Glory,

почему усекается строка с 6-ю пробелами и не усекается с 5-ю
и при чем тут этот ANSI_PADDING OFF?
при ON ничего не усекается и ок.
при OFF усекается, но не все -- ПОЧЕМУ?
если в моем коде убрать из строки с 6-ю пробелами последний пробел,
то и остальные 5 в остальных строках перестанут усекаться.
хоть убейте, не понимаю.

еще мне пишут, что с моего IP нельзя больше писать под серым ником -- что за новости?
то матершинное создание вряд ли может иметь мой IP, больно он у меня уникальный.
разблокируйте, плиз, мой IP
18 дек 14, 18:05    [17018752]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Glory
Member

Откуда:
Сообщений: 104751
Yasha123
почему усекается строка с 6-ю пробелами и не усекается с 5-ю
и при чем тут этот ANSI_PADDING OFF?
при ON ничего не усекается и ок.
при OFF усекается, но не все -- ПОЧЕМУ?
если в моем коде убрать из строки с 6-ю пробелами последний пробел,
то и остальные 5 в остальных строках перестанут усекаться.
хоть убейте, не понимаю.

Потому что имеет место слепое использование новомодных фишек TSQL без понимания того, как они работают

SET ANSI_PADDING OFF;
GO

declare @t table (id int, col_varchar varchar(30));
insert into @t (id, col_varchar) values (5, 'a     ') 
insert into @t (id, col_varchar) values (6, 'a      ') 
insert into @t (id, col_varchar) values (5, 'a     ')

select id, datalength(col_varchar) as col_varchar
from @t;
18 дек 14, 18:10    [17018770]     Ответить | Цитировать Сообщить модератору
 Re: Пробел  [new]
Yasha123
Member

Откуда:
Сообщений: 1973
Glory,
спасибо. кто бы мог подумать на values
18 дек 14, 18:16    [17018803]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить