Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Не пойму, почему запрос не работает (число прочтений - 2715 )
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Не пойму, почему запрос не работает
28. Марта 2012 :: 03:53
Печать  
Вот текст запроса:
Код
Выбрать все
" set nocount on
		|if not exists (Select * From _OUZ_Соответствие Where Поставщик = :Поставщик And Номенклатура = :Номенклатура)
		|(Insert Into _OUZ_Соответствие values(:Поставщик, :Номенклатура, :Ключ1, :Ключ2, :Ключ3))
		|Else
		|(Update _OUZ_Соответствие Set
		| Ключ1 = :Ключ1,
		| Ключ2 = :Ключ2,
		| Ключ3 = :Ключ3
		|Where Поставщик = :Поставщик And Номенклатура = :Номенклатура)
		| set nocount off" 


Согласно задумке, он должен вставлять записи, если таковые по поставщику и номенклатуре отсутствуют, иначе - обновлять ключи.
Однако, не делает ничего...
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Не пойму, почему запрос не работает
Ответ #1 - 28. Марта 2012 :: 04:15
Печать  
Попробуй так

Код
Выбрать все
" set nocount on
|if not exists (Select * From _OUZ_Соответствие Where Поставщик = :Поставщик And Номенклатура = :Номенклатура)
|(Insert Into _OUZ_Соответствие values(:Поставщик, :Номенклатура, :Ключ1, :Ключ2, :Ключ3))
|Else
|(Update _OUZ_Соответствие Set
| Ключ1 = :Ключ1,
| Ключ2 = :Ключ2,
| Ключ3 = :Ключ3
| From  _OUZ_Соответствие T
|Where T.Поставщик = :Поставщик And T.Номенклатура = :Номенклатура)
 


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #2 - 28. Марта 2012 :: 04:34
Печать  
(2) не не в этом дело таблица же одна.

Для начала узнай какая именно часть не срабатывает
update или insert/ скорее всего insert.

также можно применить общепринятый подход (как в самой 1с)
Делаешь update если количество измененных записей 0 то делаешь insert

также какая версия ms sql ?

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #3 - 28. Марта 2012 :: 04:55
Печать  
Телепатирую:
25% на то, что в таблице более/менее пяти полей
15% на несоответствие типов
10% на синтаксическую ошибку
--------------
итого 50% на то, что генерируется исключение которое автор не видит, т.к. применяет метод Выполнить() и не смотрит его результат.
  

1&&2&&3
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #4 - 28. Марта 2012 :: 05:01
Печать  
Satans Claws писал(а) 28. Марта 2012 :: 04:15:
Попробуй так

Код
Выбрать все
" set nocount on
|if not exists (Select * From _OUZ_Соответствие Where Поставщик = :Поставщик And Номенклатура = :Номенклатура)
|(Insert Into _OUZ_Соответствие values(:Поставщик, :Номенклатура, :Ключ1, :Ключ2, :Ключ3))
|Else
|(Update _OUZ_Соответствие Set
| Ключ1 = :Ключ1,
| Ключ2 = :Ключ2,
| Ключ3 = :Ключ3
| From  _OUZ_Соответствие T
|Where T.Поставщик = :Поставщик And T.Номенклатура = :Номенклатура)
 



Также - ничего не происходит
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Не пойму, почему запрос не работает
Ответ #5 - 28. Марта 2012 :: 05:04
Печать  
Тогда присоединяюсь к trad-у

ЗЫ
Z1 писал(а) 28. Марта 2012 :: 04:34:
также можно применить общепринятый подход (как в самой 1с)

Это, кстати, небезопасный подход:
Если во время апдейта происходит какая-то ошибка, то rowcount вернет 0, и дальнейшая попытка вставить строку может окончится попыткой возникновения неуникального primary key.

1Ска от такого тупо валится с маловнятными ругательствами.
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #6 - 28. Марта 2012 :: 05:12
Печать  
trad писал(а) 28. Марта 2012 :: 04:55:
Телепатирую:
25% на то, что в таблице более/менее пяти полей
15% на несоответствие типов
10% на синтаксическую ошибку
--------------
итого 50% на то, что генерируется исключение которое автор не видит, т.к. применяет метод Выполнить() и не смотрит его результат.

25% на то, что в таблице более/менее пяти полей - ровно пять полей
15% на несоответствие типов - тоже не может быть - все поля char.
10% на синтаксическую ошибку - текст запроса выполняется без ошибок
Попробую разбить на части...
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #7 - 28. Марта 2012 :: 05:26
Печать  
Satans Claws писал(а) 28. Марта 2012 :: 05:04:
Тогда присоединяюсь к trad-у

ЗЫ
Z1 писал(а) 28. Марта 2012 :: 04:34:
также можно применить общепринятый подход (как в самой 1с)

Это, кстати, небезопасный подход:
Если во время апдейта происходит какая-то ошибка, то rowcount вернет 0, и дальнейшая попытка вставить строку может окончится попыткой возникновения неуникального primary key.

1Ска от такого тупо валится с маловнятными ругательствами.

если оператор update отлажен то такой подход более производителен чем 0.

Цитата:
1Ска от такого тупо валится с маловнятными ругательствами.

не совсем правильно обвинять 1с то что валиться
так устроен odbc или более глубинный драйвер клиента sql.

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Не пойму, почему запрос не работает
Ответ #8 - 28. Марта 2012 :: 07:43
Печать  
Z1 писал(а) 28. Марта 2012 :: 05:26:
если оператор update отлажен то такой подход более производителен чем 0.


Ну, как ты отладишь update, например, от переполнения разрядности числа?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #9 - 28. Марта 2012 :: 08:14
Печать  
Satans Claws писал(а) 28. Марта 2012 :: 07:43:
Z1 писал(а) 28. Марта 2012 :: 05:26:
если оператор update отлажен то такой подход более производителен чем 0.


Ну, как ты отладишь update, например, от переполнения разрядности числа?

так твой метод из 0 даст тот же самый результат
неверный результат

то о чем ты говоришь как-то еще не разу не сталкивался с переполнением.

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Не пойму, почему запрос не работает
Ответ #10 - 29. Марта 2012 :: 09:45
Печать  
Z1 писал(а) 28. Марта 2012 :: 08:14:
так твой метод из 0 даст тот же самый результат
неверный результат

Тут вопрос в том, какое сообщение об ошибке вернет скуль на переполнение.
Если никакого - то, безусловно метод апдейта с проверкой роукаунта - лучше.
А даже более-менее вменяемое уже лучше, чем выносящее мозг сообщение о попытке вставки дупликатного ключа.



Цитата:
то о чем ты говоришь как-то еще не разу не сталкивался с переполнением.

Мне доводилось (ошибки в алгоритме рассчета себестоимости, доставшемся в наследство с базой - в некоторых ситуациях себестоимость начинала расти как снежный ком).
Вызвает неприятную возню с шаманингом и прямыми запросами Печаль
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #11 - 29. Марта 2012 :: 09:56
Печать  
Satans Claws писал(а) 29. Марта 2012 :: 09:45:
Z1 писал(а) 28. Марта 2012 :: 08:14:
так твой метод из 0 даст тот же самый результат
неверный результат

Тут вопрос в том, какое сообщение об ошибке вернет скуль на переполнение.

Если никакого - то, безусловно метод апдейта с проверкой роукаунта - лучше.
А даже более-менее вменяемое уже лучше, чем выносящее мозг сообщение о попытке вставки дупликатного ключа.

я думаю что никакого потому что с точки зрения sql это не критич ошибка обрежет данные как сможет и все


Цитата:
Мне доводилось (ошибки в алгоритме рассчета себестоимости, доставшемся в наследство с базой - в некоторых ситуациях себестоимость начинала расти как снежный ком).

Ну это явное следствие а не причина. Причина в неправильных данных по регистрам.  вот ее и надо лечить.
Хотя согласен искать все это удовольствие не доставляет.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #12 - 29. Марта 2012 :: 10:43
Печать  
al_zzz писал(а) 28. Марта 2012 :: 05:12:
trad писал(а) 28. Марта 2012 :: 04:55:
Телепатирую:
25% на то, что в таблице более/менее пяти полей
15% на несоответствие типов
10% на синтаксическую ошибку
--------------
итого 50% на то, что генерируется исключение которое автор не видит, т.к. применяет метод Выполнить() и не смотрит его результат.

25% на то, что в таблице более/менее пяти полей - ровно пять полей
15% на несоответствие типов - тоже не может быть - все поля char.
10% на синтаксическую ошибку - текст запроса выполняется без ошибок
Попробую разбить на части...

так все таки исключение то возникает или нет?
  

1&&2&&3
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не пойму, почему запрос не работает
Ответ #13 - 29. Марта 2012 :: 10:52
Печать  
(0) Вместо метода Выполнить() Попробуйте в попытке ВыполнитьСкалярный.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать