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

Есть такая задача: на вход приходит параметр для выполняемого запроса. Если параметр проходит по условию, в таблицу должно записаться другое значение и запрос должен вернуть 1, если не проходит - обновлять таблицу не надо, возвращаем 0.

Пока я себе это вижу приблизительно так:
SELECT
  CASE
    WHEN MyValue > :MyParam THEN 1
    ELSE 0
  END 
FROM
  MyTable;

UPDATE
  MyTable
SET MyValue =
  CASE
    WHEN MyValue > :MyParam THEN MyValue - :MyParam
    ELSE MyValue
  END;

По-моему не самое удобное решение. Нельзя ли объединить select и update в один запрос, или какой другой вариант (только без триггеров)?
4 фев 14, 15:07    [15516991]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Glory
Member

Откуда:
Сообщений: 104751
А зачем тут вообще select ?
4 фев 14, 15:10    [15517017]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
Нужно вернуть результат обработки параметра
4 фев 14, 15:16    [15517070]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Iry
Нужно вернуть результат обработки параметра

Разве это не будет _число_ обработанных записей ?
4 фев 14, 15:18    [15517089]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
Есть одна проблема: к БД подключения нет, только возможность послать на выполнение один запрос и скрипт. Фактически, это очень похоже на SQL inject, только это не он.
4 фев 14, 15:31    [15517204]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Iry
Есть одна проблема: к БД подключения нет, только возможность послать на выполнение один запрос и скрипт. Фактически, это очень похоже на SQL inject, только это не он.

И причем тут это ?

UPDATE MyTable SET MyValue = MyValue - :MyParam
WHERE MyValue > :MyParam
4 фев 14, 15:33    [15517225]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
Выполнив всего один запрос (опционально можно выполнить ещё и скрипт) нужно:
1. Узнать, можно ли выполнить UPDATE и вернуть "1" если можно и "0" если нельзя
2. Выполнить UPDATE и изменить значение в таблице

У меня идея такова: выполнив запрос, вернуть 1 или 0 и в любом случае выполнить скрипт с UPDATE, но значение либо изменить на новое, либо на то же самое.

В идеале хотелось бы что-то вроде такого (но именно этот код работать не будет):
SELECT
  CASE
    WHEN MyValue > :MyParam THEN
      (UPDATE
        MyTable
      SET MyValue =
        CASE
          WHEN MyValue > :MyParam THEN MyValue - :MyParam
          ELSE MyValue
        END)
    ELSE 0
  END 
FROM
  MyTable;
4 фев 14, 15:43    [15517309]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Iry
В идеале хотелось бы что-то вроде такого

Нафига ?
UPDATE и так возвращает число обработанных записей
Это будет 0 или число больше 0
4 фев 14, 15:49    [15517362]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
Послушайте, уважаемый Слава, ведь я уже написал ранее: непосредственного доступа к БД нет.
Если ещё конкретнее: есть возможность один выполнить SQL запрос и SQL скрипт, на выходе будет XML, содержащий строки и поля запроса, например:
<xml><record><result>1</result></record></xml>
Так вот, нода "result" содержит тот самый результат, который мне нужен. Но его можно получить только выполнив запрос, к тому же выполнить скрипт без запроса нельзя, так устроена система. Узнать количество обработанных скриптом строк тоже нельзя - нет подключения к БД.
4 фев 14, 16:00    [15517445]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
update MyTable
 set
  MyValue = @MyParam
where
 MyValue > @MyParam;

select case when @@rowcount > 0 then 1 else 0 end as Result;
4 фев 14, 16:01    [15517462]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Iry
Послушайте, уважаемый Слава, ведь я уже написал ранее: непосредственного доступа к БД нет.

И поэтому можно писать как можно больше команд ? И придумывать свой синтаксис ?

Iry
Узнать количество обработанных скриптом строк тоже нельзя - нет подключения к БД.

Фейспалм.
4 фев 14, 16:03    [15517480]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
update MyTable
 set
  MyValue = @MyParam
where
 MyValue > @MyParam;

select case when @@rowcount > 0 then 1 else 0 end as Result;
Тогда проще
SELECT Result=SIGN(@@ROWCOUNT)
4 фев 14, 16:05    [15517492]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
invm, спасибо. Увы, не подойдёт: сперва выполняется запрос, потом - апдейт :( Забыл упомянуть, каюсь. К тому же моё рещение в первом посте делает практически то же самое...
4 фев 14, 16:07    [15517516]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
Iry
Увы, не подойдёт: сперва выполняется запрос, потом - апдейт
Зачем?
Iry
К тому же моё рещение в первом посте делает практически то же самое...
Ваше решение апдейтит всю таблицу. Опять же, зачем?
4 фев 14, 16:10    [15517551]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Iry
Guest
invm, посыпаю голову пеплом - туплю неимоверно. Почему-то совсем не подумал сделать where в апдейте :( Всем спасибо, вопрос решён.
Фейспалм засчитан :) Спасибо всем, наставлявшим на путь истинный меня нерадивого :)
4 фев 14, 16:15    [15517598]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнить update при select-е?  [new]
Алексей Куренков
Member [заблокирован]

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

UPDATE
  MyTable
SET MyValue =
  CASE
    WHEN MyValue > :MyParam THEN MyValue - :MyParam
    ELSE MyValue
  END
OUTPUT DELETED.MyValue
WHERE 


Может так Вы имели ввиду?
4 фев 14, 18:19    [15518551]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить