Сценарий UPDATE не работает - затронуто 0 строк - PullRequest
0 голосов
/ 27 октября 2011

У меня есть база данных SQL Server, и я пытаюсь запустить сценарий обновления для одной из таблиц, но он продолжает говорить «Затронуты 0 строк».

Если я запускаю следующий скрипт, он говорит: «33 строки затронуты»

UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID = 19

Но если я запускаю следующий скрипт, он говорит: «Затронуты 0 строк»:

UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID = 19
AND ProductID = 20
AND ProductID = 23
AND ProductID = 24
AND ProductID = 25
AND ProductID = 27
AND ProductID = 28
AND ProductID = 29
AND ProductID = 30
AND ProductID = 31
AND ProductID = 32
AND ProductID = 33
AND ProductID = 54
AND ProductID = 55
AND ProductID = 56
AND ProductID = 57
AND ProductID = 58
AND ProductID = 64
AND ProductID = 71
AND ProductID = 72
AND ProductID = 73
AND ProductID = 74
AND ProductID = 75
AND ProductID = 77
AND ProductID = 105
AND ProductID = 109
AND ProductID = 152
AND ProductID = 157
AND ProductID = 158
AND ProductID = 162
AND ProductID = 164
AND ProductID = 165
AND ProductID = 167
AND ProductID = 169
AND ProductID = 170
AND ProductID = 173
AND ProductID = 174

Что я здесь не так делаю?

Я уверен, что идентификаторы продукта имеют IsDefault = 1 и Опубликовано = 1, поэтому я хочу запустить скрипт.

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 27 октября 2011

Ваше предложение WHERE неверно.Вы не хотите обновлять строку, где productID - это ВСЕ эти идентификаторы (поскольку в каждой строке может быть только один ProductID, поэтому ваш оператор WHERE никогда не будет истинным), но по одному.Вместо этого вы должны использовать IN, например так:

UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID IN ( 19, 20, 23 ... etc);

Это обновит все строки по отдельности.

4 голосов
/ 27 октября 2011

Ваша ошибка - использование AND.
Подумайте об этом: продукт не может иметь одновременно разные идентификаторы;вам нужно обновить разные продукты, по одному для каждого идентификатора.
Поэтому вы должны использовать ИЛИ:

UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID = 19
OR ProductID = 20
OR ProductID = 23
OR ProductID = 24
...

Компактный синтаксис:

UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID IN (19, 20, 23, 24, ....)
1 голос
/ 27 октября 2011
UPDATE [StoreTestDB].[dbo].[ProductVariant]   
SET [IsDefault] = 0,
    [Published] = 0
WHERE ProductID in (19, 20, 23....164)
1 голос
/ 27 октября 2011

Два варианта:

  1. Изменить все AND на OR
  2. Используйте предложение IN
1 голос
/ 27 октября 2011

Ну, я думаю, проблема в том, что вы и все ваши идентификаторы вместе IE имеет идентификатор продукта 162 ИЛИ 164. Но не оба.

Попробуйте ваше утверждение, используя IN, то есть:

ГДЕ ProductID IN (19,20,21,22 ETC)

Должно быть больше удачи!

1 голос
/ 27 октября 2011

Пользователь ИЛИ вместо. Вы говорите, что ProductID должен быть 19, 20, ... одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...