Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Pamagite
Member

Откуда:
Сообщений: 9
Доброго всем дня! Перешли с SQL Server 2000 на SQL Server 2005 недавно. На SQL 2000 работала база данных для производственной программы. После перехода в программе перестало работать копирование из одной таблицы в другую. Мы нашли некоторые проблемы и исправили, но уже который день ломаем голову над одной функцией. На старом СУБД она выглядела так:
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

CREATE  FUNCTION TESTINSERT
(
@DESTSBR INT,
@SRCSBR INT
)
RETURNS @RESULT TABLE (RESULT_ SMALLINT) AS
BEGIN
DECLARE @PARENT TABLE ([ID] INT,ACTUAL INT)
DECLARE @LEVEL INT
SET @LEVEL=1
INSERT INTO @PARENT VALUES(@DESTSBR,@LEVEL)
WHILE (@@ROWCOUNT>0)
BEGIN
IF ((SELECT COUNT(*) FROM @PARENT WHERE (ACTUAL=@LEVEL)AND([ID]=@SRCSBR))>0)
BEGIN
INSERT INTO @RESULT VALUES(0);
RETURN
END
INSERT INTO @PARENT SELECT ASSUNIT_ID,@LEVEL+1 FROM COMPOSIT C,@PARENT P WHERE (C.RESTYPE=3)AND(P.ACTUAL=@LEVEL)AND(C.RES_ID=P.[ID])
SET @LEVEL=@LEVEL+1
END
INSERT INTO @RESULT VALUES(1)
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Как видите у функции 3 параметра (DESTSBR, SRCSBR,TABLE_RESULT_VALUE). И всё выполнялось прекрасно под старой СУБД. После перехода эта функция потеряла одну переменную TABLE_RESULT_VALUE и в профайлере на функции TESTINSERT программа зависает. Функция в среде SQL 2005 перестала работать. Хотя выглядит практически так же:
USE [APROSERV]
GO
/****** Объект:  UserDefinedFunction [dbo].[TESTINSERT]    Дата сценария: 06/29/2012 16:36:37 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

create  FUNCTION [dbo].[TESTINSERT]
(
@DESTSBR INT,
@SRCSBR INT
)
RETURNS @RESULT TABLE (RESULT_ SMALLINT) AS
BEGIN
DECLARE @PARENT TABLE ([ID] INT,ACTUAL INT)
DECLARE @LEVEL INT
SET @LEVEL=1
INSERT INTO @PARENT VALUES(@DESTSBR,@LEVEL)
WHILE (@@ROWCOUNT>0)
BEGIN
IF ((SELECT COUNT(*) FROM @PARENT WHERE (ACTUAL=@LEVEL)AND([ID]=@SRCSBR))>0)
BEGIN
INSERT INTO @RESULT VALUES(0);
RETURN
END
INSERT INTO @PARENT SELECT ASSUNIT_ID,@LEVEL+1 FROM COMPOSIT as C,@PARENT as P WHERE (C.RESTYPE=3)AND(P.ACTUAL=@LEVEL)AND(C.RES_ID=P.[ID])
SET @LEVEL=@LEVEL+1
END
INSERT INTO @RESULT VALUES(1)
RETURN
END

Такое впечатление, что SQL 2005 редактирует синтаксис и не пропускает некоторые "фичи", проходившие в старом СУБД. И вообще при попытки изменения функции по аналогии с SQL 2000, 2005-ый заменяет инструкции SET, где отключались QUOTED_IDENTIFIER и SET ANSI_NULLS, в последствии сохраняются во включенном состоянии, как видно на втором примере. Подскажите пожалуйста, может быть вообще в SQL 2005 эта функция должна быть переписана?
29 июн 12, 16:50    [12796017]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pamagite
Как видите у функции 3 параметра (DESTSBR, SRCSBR,TABLE_RESULT_VALUE).

Я один вижу 2 параметра ?

Pamagite
Функция в среде SQL 2005 перестала работать. Хотя выглядит практически так же:

Да не практически, а совершенно так же
29 июн 12, 16:54    [12796050]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Отладьте вашу функцию уже наконец.
29 июн 12, 16:56    [12796062]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Pamagite
Member

Откуда:
Сообщений: 9
Glory,
мы с коллегой немного поторопились. На самом деле имелось ввиду, что в списке объектов слева отображалось 3 параметра. Это из-за того, что функция возвращает табличное значение и по умолчанию имеет такой параметр. Но дело оказалось не в функции. Я хотел узнать - а в принципе какие основные отличия и транзакте 2005 скуля от 2000. Дело в синтаксисе. Такое чувство у меня. Я бы скинул листинг возможных функций, но их слишком много... На что обращать внимание при переходе с 2000 на 2005 в плане программирования? хотя бы основные моменты
4 июл 12, 09:49    [12813762]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pamagite
Я хотел узнать - а в принципе какие основные отличия и транзакте 2005 скуля от 2000.

В принципе - никаких
Частности описаны в хелпе SQL2005 в статьях What is new

Pamagite
Дело в синтаксисе. Такое чувство у меня.

Ваши два текста функций ничем не отличаются.

Pamagite
На что обращать внимание при переходе с 2000 на 2005 в плане программирования? хотя бы основные моменты

Тестировать производительность. Поведение оптимизитора может меняеться даже после установки патча.
Из зачем переходиь на 2005, если уже есть 2008R2.
4 июл 12, 10:33    [12814043]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
qwerty112
Guest
Pamagite
...на функции TESTINSERT программа зависает. Функция в среде SQL 2005 перестала работать...
WHILE (@@ROWCOUNT>0)
BEGIN
  IF ((SELECT COUNT(*) FROM @PARENT WHERE (ACTUAL=@LEVEL)AND([ID]=@SRCSBR))>0)
  BEGIN
    INSERT INTO @RESULT VALUES(0);
    RETURN
  END
  INSERT INTO @PARENT SELECT ASSUNIT_ID,@LEVEL+1 FROM COMPOSIT as C,@PARENT as P WHERE (C.RESTYPE=3)AND(P.ACTUAL=@LEVEL)AND(C.RES_ID=P.[ID])
  SET @LEVEL=@LEVEL+1
END

вы на бесконечный цикл нарвались, походу,
и не удивительно ...

@@ROWCOUNT - ЧЕГО вы проверяете ?
наверняка хотели - INSERT-а
а проверяете, по факту - @@ROWCOUNT для SET @LEVEL=@LEVEL+1
4 июл 12, 10:34    [12814058]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Pamagite
Member

Откуда:
Сообщений: 9
qwerty112,
ТАк понимаете, в 2000 она работает! и все работало, пока не перешли на 2005. кстати, такой переход обусловлен отсутствием поддержки 2008 скуля разработчиками.
4 июл 12, 13:39    [12815869]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pamagite
ТАк понимаете, в 2000 она работает! и все работало, пока не перешли на 2005.

Когда что-то НЕ работает, то сервер генерирует сообщение об ошибке
А когда что-то работает долго или выдает неправильный результат, то разработчик берет и тестирует свой код.
4 июл 12, 13:41    [12815895]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Pamagite
Member

Откуда:
Сообщений: 9
qwerty112, Отслеживал поведение на параллельном сервере с 2000 скулем, проходил текст основных запросов - ничего не меняется. Эта функция, принимет параметры от предшествующих запросов. точнее во вьюхе делается сопоставление таблиц INNER JOIN_ом. Может здесь есть какие то новшества?
4 июл 12, 13:42    [12815908]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Pamagite
qwerty112,
ТАк понимаете, в 2000 она работает! и все работало, пока не перешли на 2005. кстати, такой переход обусловлен отсутствием поддержки 2008 скуля разработчиками.

Вы апгрейд адвайзером пользовались ?
4 июл 12, 13:46    [12815954]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Pamagite
Member

Откуда:
Сообщений: 9
Ozerov,
По большому счету нет
4 июл 12, 13:55    [12816045]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Pamagite
qwerty112,
ТАк понимаете, в 2000 она работает! и все работало, пока не перешли на 2005
Бесконечный цикл, который показан, будет бесконечным на любой версии - это поведение у сиквела не менялось.
4 июл 12, 14:00    [12816095]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Pamagite
Ozerov,
По большому счету нет

Вообще операция полезная. Нам помогала найти места, требующие исправления.
4 июл 12, 14:21    [12816269]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение скрипта СУБД SQL 2000 на СУБД SQL 2005  [new]
Glory
Member

Откуда:
Сообщений: 104751
Там нет бесконечного цикла.
WHILE (@@ROWCOUNT>0) нужен для вхождения в цикл
Выход из цикла определяет
IF ((SELECT COUNT(*) FROM @PARENT WHERE (ACTUAL=@LEVEL)AND([ID]=@SRCSBR))>0)
  BEGIN
    INSERT INTO @RESULT VALUES(0);
    RETURN
  END


Типичный обход дерева не через рекурсию, а через цикл.
4 июл 12, 14:28    [12816314]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить