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

Откуда:
Сообщений: 10398
UPDATE Users
SET [Sid] = ( 
	SELECT TOP(1) sid 
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName))))
	, [Source] = 'Old'
WHERE [Sid] IS NULL

В результате во всех строках таблицы Users, столбец [Source] принимает значение 'Old'
Хотя есть записи где [Sid] IS NULL

Что делаю не правильно?
Спасибо.
1 дек 15, 10:00    [18495455]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
В результате во всех строках таблицы Users, столбец [Source] принимает значение 'Old'
Хотя есть записи где [Sid] IS NULL

И чем вы это докажите ?
1 дек 15, 10:01    [18495464]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
a_voronin
Member

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

Я готов поверить в то, что у вас [Source] присваивается Old, а Sid остается NULL
1 дек 15, 10:04    [18495486]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
a_voronin
MSSQLAndDotNet,

Я готов поверить в то, что у вас [Source] присваивается Old, а Sid остается NULL

Да, именно так
1 дек 15, 10:05    [18495496]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Елки палки, я изменяю Sid и использую его в условии
а как же правильно сделать?
1 дек 15, 10:06    [18495509]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
a_voronin
MSSQLAndDotNet,

Я готов поверить в то, что у вас [Source] присваивается Old, а Sid остается NULL

Не все записи Sid остаются null
1 дек 15, 10:07    [18495515]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27978
MSSQLAndDotNet
UPDATE Users
SET [Sid] = ( 
	SELECT TOP(1) sid 
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName))))
	, [Source] = 'Old'
WHERE [Sid] IS NULL

В результате во всех строках таблицы Users, столбец [Source] принимает значение 'Old'
Хотя есть записи где [Sid] IS NULL.

Судя по тому, что у Вас в условии WHERE и что вы написали в последнем предложении, внимательным Вас не назовёшь :)
Видать ошиблись где-то, в этом и проблема.
1 дек 15, 10:07    [18495523]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
a_voronin
Member

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

Это значит, что ваш SELECT TOP(1) sid вернул 0 записей
1 дек 15, 10:09    [18495533]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
Елки палки, я изменяю Sid и использую его в условии
а как же правильно сделать?

Давно уже пора знать, что изменения в UPDATE отложенные. Т.е. присваеваемое полю значению никак не влияет на другие выражения
1 дек 15, 10:10    [18495541]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Елки палки, я изменяю Sid и использую его в условии
а как же правильно сделать?

Давно уже пора знать, что изменения в UPDATE отложенные. Т.е. присваеваемое полю значению никак не влияет на другие выражения

Мой запрос написан с учетом этого утверждения :)
все норм ИМХО
1 дек 15, 10:14    [18495565]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
skyANA
MSSQLAndDotNet
UPDATE Users
SET [Sid] = ( 
	SELECT TOP(1) sid 
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName))))
	, [Source] = 'Old'
WHERE [Sid] IS NULL

В результате во всех строках таблицы Users, столбец [Source] принимает значение 'Old'
Хотя есть записи где [Sid] IS NULL.

Судя по тому, что у Вас в условии WHERE и что вы написали в последнем предложении, внимательным Вас не назовёшь :)
Видать ошиблись где-то, в этом и проблема.


Я хочу обновить все записи таблицы Users в которых [Sid] IS NULL

Обновить таким образом, что бы новый [Sid] принимал з-е
SELECT TOP(1) sid 
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName))))

а, поле Source во всех обновленных записях принимало з-е 'Old'

ИМХО запрос правильно написал :)
1 дек 15, 10:14    [18495567]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
a_voronin
Member

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

Вы сначала находите все записи по условию, потом всем им присваиваете значение, где надо. Условие проверяется до любых присвоений.
1 дек 15, 10:15    [18495571]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
ИМХО запрос правильно написал :)

И результат полностью соответствует тому запросу, что вы написали.
1 дек 15, 10:16    [18495576]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Во я тупанул
расходимся

:)

всем спасибо.
1 дек 15, 10:17    [18495579]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
На скорую руку

UPDATE Users
SET [Sid] = ( 
	SELECT TOP(1) sid 
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName))))
	, [Source] = CASE WHEN(SELECT TOP(1) COUNT(sid)
	FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(UserName)))) = 0 THEN NULL ELSE 'Old' END
WHERE [Sid] IS NULL
1 дек 15, 10:22    [18495605]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE обновляет все записи  [new]
Jaffar
Member

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

на будущее ,если хочешь проверить что делает Update - замени его select`ом и посмотри что он возвращает.

select
u.Sid SID_OLD, 
(SELECT TOP(1) sid FROM db2.dbo.[Logind] AS L WHERE RTRIM(LTRIM(LOWER(L.login))) = RTRIM(LTRIM(LOWER(u.UserName)))) Sid_NEW,
u.Source Source_OLD,
'Old' Source_NEW
from Users u with(nolock)
where
		Sid is NULL
1 дек 15, 11:10    [18495918]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить