Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #30 : 20-05-2008 11:25 » |
|
Теперь я делаю так: CREATE PROCEDURE dbo.procedure4 AS BEGIN update t_group set id_PurpPay = dbo.GetIdPurp(t_group.id_group) END
Где dbo.GetIdPurp - это функция, которая таки возвращает по t_group.id_group нужный мне Id_PurpPay. Такая конструкция обновит ВСЕ поля в таблице t_group? Она уже минут 5 выполняется... не знаю, снимать или подождать
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #31 : 20-05-2008 11:27 » |
|
Да, выполнилась Все нормально УРРААА!!! Хорошие, золотые мои, что б я без вас делала???
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #32 : 20-05-2008 19:58 » |
|
Убейте меня, если я понимаю, почему не работал if... Это всегда пожалуйста Так работать не будет IF @X = NULL ... Надо так IF @X IS NULL ... Или так IF @X IS NOT NULL ... В зависимости от потребностей. А два раза делать запрос нехорошо (с точки зрения производительности).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
|
« Ответ #33 : 20-05-2008 21:40 » |
|
Arinyshka, тому що потому что Null нельзя сравнивать, его можно только определить Это нельзя понять, это можно только запомнить (с) Кто сказал не знаю, но помню что сказал не я
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #34 : 21-05-2008 06:37 » |
|
А два раза делать запрос нехорошо (с точки зрения производительности).
угу, пасиб... разницу уловила. Про запрос 2 раза - я подозревала, что это нехорошо.. И уже в другом месте сейчас тыкаюсь почти в такую же ситуацию... как этого можно было избежать? Результату запроса можно назначить ...эээ... псевдоним, да? - как таблице в запросе? Ну, вот мы пишем: select t1.id, t1.name from table t1
А можно так результату запроса? Типа (select t1.id, t1.name from table t1) z1
И выбирать что-нить из z1 потом, как из таблицы? Arinyshka, тому що потому что Null нельзя сравнивать, его можно только определить Это нельзя понять, это можно только запомнить (с) Кто сказал не знаю, но помню что сказал не я так и запомню - нельзя сравнивать с пустотой, ибо пустота бесконечна... )
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #35 : 22-05-2008 05:59 » |
|
Arinyshka, в данном случае так абстрактно спрашивать нельзя. Если это подзапрос запроса, то можно. Если отдельный запрос, то нельзя - только через переменную типа table или временную таблицу.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #36 : 22-05-2008 06:50 » |
|
Arinyshka, в данном случае так абстрактно спрашивать нельзя. Если это подзапрос запроса, то можно. Если отдельный запрос, то нельзя - только через переменную типа table или временную таблицу.
Понятненько я имела в виду собственную тяжеловесную конструкцию: if EXISTS (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) begin set @tempId =(SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) end
Значит, можно как-то так, но не компилится: if EXISTS (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) res begin set @tempId =res end
Так тоже не компилится: (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) rs
if EXISTS rs
begin set @tempId =rs end
А как это правильно оформить? Чтобы использовать результаты подзапроса в других запросах в пределах одной хранимой?
|
|
« Последнее редактирование: 22-05-2008 06:52 от Arinyshka »
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Sla
|
|
« Ответ #37 : 22-05-2008 07:19 » |
|
а вот так? select @tempId = id_PurposePay from PurposeOfPayment where PurposePay = @strtemp
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #38 : 22-05-2008 07:21 » |
|
Просто, без псевдонимов (это так называется?) запрос работает, все в порядке. Хотелось научиться использовать его результаты несколько раз
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Sla
|
|
« Ответ #39 : 22-05-2008 07:42 » |
|
в принципе, ничего страшного не произойдет если ты будешь делать два запроса подряд в одной сессии - на производительность это может повлиять не очень сильно но вот если надо в одной процедуре два серьезных запроса делать, то нужно пересматривать алгоритм работы т.е. Select 1 что-то делаю
Что- то делаю другое
Select 1 что-то делаю
но Select 1 что-то делаю 1 Select 1 что-то делаю 2
нужно превратить
Select 1 что-то делаю 1 что-то делаю 2
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #40 : 22-05-2008 08:46 » |
|
ага... ок, обдумаю
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #41 : 22-05-2008 09:05 » |
|
А вот такая конструкция: CREATE PROCEDURE dbo.Fill_F_RS_idTypeRS AS BEGIN declare @temp_idRS INT
update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS END
почему не коммитится? Ничего не понимаю У меня появилось новое поле в таблице, мне нужно его автоматом заполнить. Да, глупо, что оно зависит от значения поля в этой же таблице... Это не совсем так, но первоначальные данные нужно вбить именно в такой зависимости. Бо таблица существует в реальной БД, там свыше 5000 записей, реорганизация дается дорого... а может, создавать временную таблицу, поле в ней и уже потом update нужное мне поле в f_rs?
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #42 : 22-05-2008 11:43 » |
|
Хотелось научиться использовать его результаты несколько раз Вот это-то меня и смущает. Какой-то алгоритмический подход к задаче. Ты LISP знаешь?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #43 : 22-05-2008 11:48 » |
|
нет, не знаю С sql столкнулась впервые буквально месяц назад. Сейчас вот по работе delphi+sql. Мыслю, действительно, на старом добром Паскале... уж не судите строго :'(
|
|
« Последнее редактирование: 22-05-2008 11:56 от Arinyshka »
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #44 : 22-05-2008 12:00 » |
|
А вот такая конструкция: CREATE PROCEDURE dbo.Fill_F_RS_idTypeRS AS BEGIN declare @temp_idRS INT
update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS END
почему не коммитится? Ничего не понимаю У меня появилось новое поле в таблице, мне нужно его автоматом заполнить. Да, глупо, что оно зависит от значения поля в этой же таблице... Это не совсем так, но первоначальные данные нужно вбить именно в такой зависимости. Бо таблица существует в реальной БД, там свыше 5000 записей, реорганизация дается дорого... а может, создавать временную таблицу, поле в ней и уже потом update нужное мне поле в f_rs? из такой ситуации уже второй раз выхожу одинаково: пишу отдельно функцию, определяющую значение для 1 поля, и процедуру с update table, ровненько вызывающую эту функцию... Разве это правильная последовательность действий?
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #45 : 22-05-2008 15:56 » |
|
Поскольку SQL всё же язык более функциональный, то все подобные вещи делаются так: UPDATE T_Group SET id_PurpPay = T.id_PurposePay FROM (SELECT id_PurposePay FROM PurposeOfPayment WHERE PurposePay = @strtemp) T Если подзапрос T вернул записи, то UPDATE выполнится - для всех записей T_Group значение поля обновится на значение id_PurposePay первой записи подзапроса. Если же запрос запись не вернул, то UPDATE вообще не выполнится. И не надо никаких временных сохранений, проверок, нагромождения функций и т.д. P.S. А с функциональным программированием для общего развития рекомендую познакомиться - это отдельная парадигма программирования, в ней мозги по-другому работают . Нужно мыслить решение задачи как композицию функций, когда результаты одной тут же подставляются в параметры другой, при этом понятия "переменная" (как область памяти, куда можно записывать разные значения) вообще нет, есть лишь символические обозначения как в математике. Центральным местом функционального программирования является лямбда-исчисление Чёрча.
|
|
« Последнее редактирование: 22-05-2008 16:00 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #46 : 23-05-2008 04:16 » |
|
если я правильно понял следующий код update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS то делается это так (MS_SQL) update f_rs set id_TypeRS = case when Tip_RS = 0 then 1 else 2 end
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
|