Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Работает в SQL2000, но не работает в SQL2005 (число прочтений - 3886 )
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Работает в SQL2000, но не работает в SQL2005
04. Февраля 2010 :: 11:48
Печать  
Делал несколько отчетов с прямыми запросами. Вот один из них перестал работать при переходе на 2005. Внешне это выглядит как просто зависание 1С.
Из особенностей отчета:
1) Используются временные функции , т.е.
CREATE или ALTER FUNCTION dbo.NormalPhone5(@s1 varchar(80)) RETURNS varchar(80) as
2) Используются временные таблицы, т.е.
     |SELECT ...
     |INTO #TMP_1

     |SELECT * FROM #TMP_1

     |DROP table #TMP_1
Где почитать про эти особенности SQL2005?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #1 - 04. Февраля 2010 :: 12:01
Печать  
vovan519 писал(а) 04. Февраля 2010 :: 11:48:
Делал несколько отчетов с прямыми запросами. Вот один из них перестал работать при переходе на 2005. Внешне это выглядит как просто зависание 1С.
Из особенностей отчета:
1) Используются временные функции , т.е.
CREATE или ALTER FUNCTION dbo.NormalPhone5(@s1 varchar(80)) RETURNS varchar(80) as
2) Используются временные таблицы, т.е.
     |SELECT ...
     |INTO #TMP_1

     |SELECT * FROM #TMP_1

     |DROP table #TMP_1
Где почитать про эти особенности SQL2005?

лучше весь пример давай.
из того что написано эти операторы должны работать в sql2005.
Какой sp установлен на sql2005 ?
SELECT ...      |INTO #TMP_1 вообще не рекомендуется
использовать при этом происходит блокировка всей tempdb
вот может ты и попадаешь на какие либо системные взаимоблокировки по базе tempdb


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


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #2 - 04. Февраля 2010 :: 12:15
Печать  
Z1, ну весь так весь. Напомню только, что на SQL2000 работает. На сколько он оптимален, не знаю. Ну что могу...
Ах да, запрос собственно ищет дубли контрагентов по номерам телефона.

Процедура СоздатьФункцииТелефонов(RS)
// CREATE сделал до этого
     ТекстФункции = "
     |ALTER FUNCTION dbo.NormalPhone5(@s1 varchar(80)) RETURNS varchar(80) as
     |BEGIN
     |  declare @a varchar(80)
     |  declare @c varchar(1)
     |  declare @i int
     |  declare @j int
     |  declare @l int
     |  set @a = substring(@s1,1,80)
     |  set @a = replace(@a,')','')
     |  set @a = replace(@a,'(','')
     |  set @a = replace(@a,'/','')
     |  set @a = replace(@a,'-','')
     |  if (charindex(',',@a) > 5) set @a = left(@a,charindex(',',@a)-1)
     |  else
     |  if (charindex(';',@a) > 5) set @a = left(@a,charindex(';',@a)-1)
     |  else
     |  if (charindex(' ',@a) > 5) set @a = left(@a,charindex(' ',@a)-1)
     |  set @a = replace(@a,',','')
     |  set @a = replace(@a,';','')
     |  set @a = replace(@a,' ','')
     |  set @a = replace(@a,'.','')
     |  set @a = ltrim(@a)
     |  set @i = 1
     |  set @l = len(@a)
     |  while (@i<=@l)
     |    begin
     |      set @c = substring(@a,@i,1)
     |      set @j = charindex(@c,'абвгдеёжзийклмнопрстуфхцчшъщьэюя')
     |      if (@j > 0)
     |             begin   
     |               set @a = left(@a,@i-1)      
     |          set @i = @l
     |        end
     |      set @i = @i + 1
     |    end
     |  return @a
     |END   
     |";                                     
     RS.Открыть(ТекстФункции);   
     ТекстФункции = "
     |ALTER FUNCTION dbo.NormalPhone4(@s1 varchar(80)) RETURNS int as
     |BEGIN
     |  return len(ltrim(rtrim(@s1)))
     |END   
     |";                                     
     RS.Открыть(ТекстФункции);   
КонецПроцедуры // СоздатьФункцииТелефонов() 
Процедура ПроверитьДублиТелефонов2()
     ТЗ.Очистить();
     RS = СоздатьОбъект("ODBCRecordset");
     СоздатьФункцииТелефонов(RS);
     ТекУсловие = "";
     ТекстТаблицы = "
     |SELECT Спр.IsMark as С
     |      ,Спр.ID as [Элемент $Справочник.Контрагенты]
     |      ,$Спр.ДатаСозд as ДатаСозд
     |      ,$Спр.Автор as [Автор $Справочник.Пользователи]
     |      ,$Спр.ЮрФизЛицо as [ЮрФизЛицо $Справочник]
     |      ,CAST(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны) as varchar(80)) as Телефоны
     |           ,dbo.NormalPhone5(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны)) as Нормал
     |INTO #TMP_1
     |FROM $Справочник.Контрагенты as Спр WITH (nolock)
     |LEFT JOIN $Справочник.ЮрЛица СпрЮ ON $ВидСправочника36.ЮрЛица + СпрЮ.ID = $Спр.ЮрФизЛицо
     |LEFT JOIN $Справочник.ФизЛица СпрФ ON $ВидСправочника36.ФизЛица + СпрФ.ID = $Спр.ЮрФизЛицо
     |WHERE dbo.NormalPhone4(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны)) > 5
     |";
     Если ДобавитьФильтрПоКонтрагентам(RS,ТекУсловие) = 0 Тогда
           ТекстТаблицы = ТекстТаблицы + " AND "+ТекУсловие;
     КонецЕсли;
     ТекстТаблицы = ТекстТаблицы + "
     |
     |SELECT dbo.NormalPhone5($СпрЮ.Телефоны) as Нормал2
     |INTO #TMP_3
     |FROM $Справочник.ЮрЛица as СпрЮ
     |WHERE dbo.NormalPhone4($СпрЮ.Телефоны) > 5
     |UNION ALL
     |SELECT dbo.NormalPhone5($СпрФ.Телефоны) as Нормал2
     |FROM $Справочник.ФизЛица as СпрФ
     |WHERE dbo.NormalPhone4($СпрФ.Телефоны) > 5
     |
     |SELECT TMP3.Нормал2 as Нормал2
     |INTO #TMP_2
     |FROM #TMP_3 as TMP3
     |GROUP BY TMP3.Нормал2
     |HAVING COUNT(*) > 1
     |";                                     
     //RS.Отладка(1);
     RS.Открыть(ТекстТаблицы);   
     ТекстЗапроса = "
     |SELECT * FROM #TMP_1
     |INNER JOIN #TMP_2 ON #TMP_1.Нормал = #TMP_2.Нормал2
     |WHERE LEN(#TMP_1.Нормал) > 5 AND #TMP_1.Нормал <> '2404040'
     |ORDER BY #TMP_1.Нормал
     |";                                     
     RS.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ);
     //УдалитьФункцииТелефонов(RS);
     ТекстТаблицы = "
     |DROP table #TMP_1
     |DROP table #TMP_2
     |DROP table #TMP_3
     |";                                     
     RS.Открыть(ТекстТаблицы);   
     ТЗ.УстановитьПараметрыКолонки("С",,,,,3,,);
     ТЗ.ВыводитьПиктограммы("С");
     ТЗ.ВидимостьКолонки("Нормал2",0);
     КолвоСтрок = ТЗ.КоличествоСтрок();
КонецПроцедуры // ПроверитьДублиТелефонов2()

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #3 - 04. Февраля 2010 :: 12:31
Печать  
почему
    |SELECT TMP3.Нормал2 as Нормал2
а не

    |SELECT #TMP3.Нормал2 as Нормал2 ?


Я не знаю как отрабатывет выполнить инструкцию когда
ей дается несколько t-sql операторов

А что происходит если включить Отладка
и выполнить через qa

и  не ответил про sp sql2005
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #4 - 04. Февраля 2010 :: 12:51
Печать  
Поставил # таже фигня, только еще раз подвесил базу.
SQL2005 64-bit sp2, ось тоже 64-bit
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #5 - 04. Февраля 2010 :: 12:59
Печать  
vovan519 писал(а) 04. Февраля 2010 :: 12:51:
Поставил # таже фигня, только еще раз подвесил базу.
SQL2005 64-bit sp2, ось тоже 64-bit


Насчет нескольких операторов я так и не понял.
Давай проверим дело в функциях или нет
давай поставим
ALTER FUNCTION dbo.NormalPhone5(@s1 varchar(80)) RETURNS varchar(80) as
     BEGIN
return 10
END
ALTER FUNCTION dbo.NormalPhone4(@s1 varchar(80)) RETURNS varchar(80) as
     BEGIN
return 10
END
после такого переопределения функция выполни заново тест.
Т.е. определим зависание идет в функции  или дело в чем то другом.

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #6 - 04. Февраля 2010 :: 13:01
Печать  
vovan519 писал(а) 04. Февраля 2010 :: 12:51:
Поставил # таже фигня, только еще раз подвесил базу.
SQL2005 64-bit sp2, ось тоже 64-bit

кстати off для этой ветки но очень интересует сколько оперативной памяти под sql2005 ?
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #7 - 04. Февраля 2010 :: 13:13
Печать  
Z1 - 64G
Запущу попозже, когда все с работы уйдут, пусть пока работают нормально Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #8 - 04. Февраля 2010 :: 13:24
Печать  
vovan519 писал(а) 04. Февраля 2010 :: 13:13:
Z1 - 64G
Запущу попозже, когда все с работы уйдут, пусть пока работают нормально Улыбка

Правильно ли я понял что под sql процесс выделено 64 Гб ?
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #9 - 05. Февраля 2010 :: 07:25
Печать  
Z1 - да
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #10 - 05. Февраля 2010 :: 07:30
Печать  
Очень круто. Моя бы база влезла бы целиком три раза.
(Может я сразу перейду на 2008 )

Давай к subj вернемся. Может эксперементы делать на копии базы.
Тогда точно  сможешь все отладить и никому при этом не будешь мешать.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #11 - 05. Февраля 2010 :: 09:46
Печать  
- Инсерты в разные временные таблицы лучше бы выполнять отдельными батчами.
- вместо RS.Открыть() RS.ВыполнитьИнструкцию()
- set nocount on дописать в начало батчей
А если зависающий запрос из студии выполнить тоже зависает?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #12 - 05. Февраля 2010 :: 09:56
Печать  
vovan519 писал(а) 04. Февраля 2010 :: 13:13:
Z1 - 64G
Запущу попозже, когда все с работы уйдут, пусть пока работают нормально Улыбка

а что при выполнении все зависают?
зы: nolock-и еще прописать для всех справочников
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #13 - 05. Февраля 2010 :: 10:10
Печать  
alexdd писал(а) 05. Февраля 2010 :: 09:56:
vovan519 писал(а) 04. Февраля 2010 :: 13:13:
Z1 - 64G
Запущу попозже, когда все с работы уйдут, пусть пока работают нормально Улыбка

а что при выполнении все зависают?
зы: nolock-и еще прописать для всех справочников

скорее всего функция на чем то попадает в бесконечный цикл.
поэтому я и предложил сделать пост №5
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Работает в SQL2000, но не работает в SQL2005
Ответ #14 - 05. Февраля 2010 :: 10:33
Печать  
(vovan519) Кстати какую версию 1с++ используешь ?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать