Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: выборка из текстовой строки неизвестной длины  (Прочитано 43183 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline 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
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #31 : 20-05-2008 11:27 » 

Да, выполнилась Улыбаюсь Все нормально Улыбаюсь УРРААА!!! Хорошие, золотые мои, что б я без вас делала???  Люблю!
Записан

Непонятная свобода обручем сдавила грудь...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 20-05-2008 19:58 » 

Цитата: Arinyshka
Убейте меня, если я понимаю, почему не работал if...
Это всегда пожалуйста Улыбаюсь
Так работать не будет
Код: (Text)
IF @X = NULL
...
Надо так
Код: (Text)
IF @X IS NULL
...
Или так
Код: (Text)
IF @X IS NOT NULL
...
В зависимости от потребностей.

А два раза делать запрос нехорошо (с точки зрения производительности).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 20-05-2008 21:40 » 

Arinyshka, тому що потому что Null нельзя сравнивать, его можно только определить Улыбаюсь
Это нельзя понять, это можно только запомнить (с) Кто сказал не знаю, но помню что сказал не я Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 22-05-2008 05:59 » 

Arinyshka, в данном случае так абстрактно спрашивать нельзя. Если это подзапрос запроса, то можно. Если отдельный запрос, то нельзя - только через переменную типа table или временную таблицу.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 22-05-2008 07:19 » 

а вот так?
Код:
 select @tempId = id_PurposePay
                             from PurposeOfPayment
                             where PurposePay = @strtemp
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #38 : 22-05-2008 07:21 » 

Просто, без псевдонимов (это так называется?) запрос работает, все в порядке. Хотелось научиться использовать его результаты несколько раз
Записан

Непонятная свобода обручем сдавила грудь...
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 22-05-2008 07:42 » 

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

Что- то делаю другое

Select 1
что-то делаю

но
Select 1
что-то делаю 1
Select 1
что-то делаю 2

нужно превратить

Select 1
что-то делаю 1
что-то делаю 2
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #40 : 22-05-2008 08:46 » 

ага... ок, обдумаю Улыбаюсь
Записан

Непонятная свобода обручем сдавила грудь...
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 22-05-2008 11:43 » 

Цитата: Arinyshka
Хотелось научиться использовать его результаты несколько раз
Вот это-то меня и смущает. Какой-то алгоритмический подход к задаче. Ты LISP знаешь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #43 : 22-05-2008 11:48 » 

нет, не знаю Жаль С sql столкнулась впервые буквально месяц назад. Сейчас вот по работе delphi+sql. Мыслю, действительно, на старом добром Паскале... уж не судите строго :'(
« Последнее редактирование: 22-05-2008 11:56 от Arinyshka » Записан

Непонятная свобода обручем сдавила грудь...
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 22-05-2008 15:56 » 

Поскольку SQL всё же язык более функциональный, то все подобные вещи делаются так:

Код: (Text)
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
Молодой специалист

ru
Offline 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!
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines