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

Откуда:
Сообщений: 136
Доброго времени.

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

Есть функция:
--Процедура по номеру ООФ выдает имя привязанного файла с маской СП_хххх_дд.мм.гггг.pdf с наибольшей датой

create function [dbo].[GetFileNameSP]
    (
      @obj_code NVARCHAR(30)
    )
returns nvarchar (200)
AS 



BEGIN
 
 DECLARE @ttt TABLE ([cod] [int] NOT NULL,[dat] [date] NULL,[file] [nvarchar] (255) NULL)
 DECLARE @ddd NVARCHAR (255)
 DECLARE @codn [int]
 DECLARE updtmp CURSOR FOR SELECT [cod],[file] FROM @ttt FOR UPDATE OF [dat],[file]

 INSERT INTO @ttt ([cod],[file]) SELECT [DAE_DOCUMENT],[DOC_FILENAME]
 FROM [dbo].[R5DOCENTITIES] LEFT OUTER JOIN dbo.R5DOCUMENTS ON DAE_DOCUMENT=DOC_CODE
 WHERE DAE_CODE =N'@obj_code'+N'#ppk' AND  LEFT ([DOC_FILENAME],3)=N'СП_'

 OPEN updtmp
 
 FETCH NEXT FROM updtmp INTO @codn,@ddd
 WHILE @@FETCH_STATUS=0 

 BEGIN 
BEGIN TRY 
 UPDATE @ttt SET [dat] = CONVERT(DATETIME,LEFT(RIGHT(@ddd,14),10),105) WHERE @ttt.cod=@codn
 end TRY
BEGIN CATCH
UPDATE @ttt SET [file]=N'Ошибка!!!' WHERE @ttt.cod=@codn
END CATCH
 FETCH NEXT FROM updtmp INTO @codn,@ddd
 END 
 
 CLOSE updtmp
 DEALLOCATE updtmp
 
 --select TOP 1 @ddd=[file] FROM @ttt ORDER BY [dat] DESC
 --IF @ddd IS NOT NULL  SELECT @ddd
 --ELSE SELECT N'Ошибка!!!'
 --SELECT @ddd
--DROP TABLE @ttt

END


при выполнении выдает ошибку:

Сообщение 137, уровень 16, состояние 1, процедура GetFileNameSP, строка 30
Must declare the scalar variable "@ttt".
Сообщение 137, уровень 16, состояние 1, процедура GetFileNameSP, строка 33
Must declare the scalar variable "@ttt".
не могу понять в чем дело?

Функцию переделывал из ранее написанной процедуры, которая работает с использованием временной таблицы, но сабака report manager поддерживает работу только с функциями

Заранее благодарю
6 мар 12, 17:34    [12205560]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Glory
Member

Откуда:
Сообщений: 104751
WHERE @ttt.cod=@codn --- WHERE cod=@codn
6 мар 12, 17:38    [12205608]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Alxndr,

либо алиас, либо [@ttt].cod вместо @ttt.cod

Но вообще-то ужас какой-то.
Зачем курсор? Где RETURN?
6 мар 12, 17:41    [12205628]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Alxndr
Member

Откуда:
Сообщений: 136
благодарю за советы
return будет :)
но пошла ошибка следующего типа:

Сообщение 443, уровень 16, состояние 14, процедура GetFileNameSP, строка 34
Invalid use of a side-effecting operator 'BEGIN TRY' within a function.

а как лучше сделать без курсора?
6 мар 12, 17:50    [12205729]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Alxndr
Member

Откуда:
Сообщений: 136
iap,
--Процедура по номеру ООФ выдает имя привязанного файла с маской СП_хххх_дд.мм.гггг.pdf с наибольшей датой

CREATE FUNCTION [dbo].[GetFileNameSP] ( @obj_code NVARCHAR(30) )
RETURNS NVARCHAR(200)
AS 
    BEGIN
 
        DECLARE @ttt TABLE
            (
              [cod] [int] NOT NULL ,
              [dat] [date] NULL ,
              [file] [nvarchar](255) NULL
            )
        DECLARE @ddd NVARCHAR(255)
        DECLARE @codn [int]
        DECLARE updtmp CURSOR FOR SELECT [cod],[file] FROM @ttt FOR UPDATE OF [dat],[file]

        INSERT  INTO @ttt
                ( [cod] ,
                  [file]
                )
                SELECT  [DAE_DOCUMENT] ,
                        [DOC_FILENAME]
                FROM    [dbo].[R5DOCENTITIES]
                        LEFT OUTER JOIN dbo.R5DOCUMENTS ON DAE_DOCUMENT = DOC_CODE
                WHERE   DAE_CODE = N'@obj_code' + N'#NMNG'
                        AND LEFT([DOC_FILENAME], 3) = N'СП_'

        OPEN updtmp
 
        FETCH NEXT FROM updtmp INTO @codn,@ddd
        WHILE @@FETCH_STATUS = 0 
            BEGIN 
                BEGIN TRY 
                    UPDATE  @ttt
                    SET     [dat] = CONVERT(DATETIME, LEFT(RIGHT(@ddd, 14), 10), 105)
                    WHERE   cod = @codn
                END TRY
                BEGIN CATCH
                    UPDATE  @ttt
                    SET     [file] = N'Ошибка!!!'
                    WHERE   cod = @codn
                END CATCH
                FETCH NEXT FROM updtmp INTO @codn,@ddd
            END 
 
        CLOSE updtmp
        DEALLOCATE updtmp
 
 select TOP 1 @ddd=[file] FROM @ttt ORDER BY [dat] DESC
 --IF @ddd IS NOT NULL  SELECT @ddd
 --ELSE SET @ddd= N'Ошибка!!!'
RETURN @ddd

    END


так работает без ошибки, но все таки хотелось бы узнать как сделать более оптимально??? Я только учусь.
6 мар 12, 17:57    [12205786]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Alxndr
Member

Откуда:
Сообщений: 136
не не работает ошибка Invalid use of a side-effecting operator 'BEGIN TRY' within a function осталась
6 мар 12, 17:59    [12205801]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alxndr
не не работает ошибка Invalid use of a side-effecting operator 'BEGIN TRY' within a function осталась

Ну так прежде, чем портировать процедуру в функцию, не прочитать ли в хелпе про разрешенные в функциях команды ?
6 мар 12, 18:03    [12205831]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Alxndr
не не работает ошибка Invalid use of a side-effecting operator 'BEGIN TRY' within a function осталась

И какая же это процедура если декларирована как
CREATE FUNCTION [dbo].[GetFileNameSP] 


В функции хранськи , а не вставка/обнавление/удаление, как и транзакции.
6 мар 12, 18:03    [12205833]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре хелп  [new]
Alxndr
Member

Откуда:
Сообщений: 136
Ну да прочитал, печально, попробовал извратиться окончательно - написал функцию, которая вызывает процедуру, в которой обрабатывется исключение, дак cognos report ли одна из его частей (слава однако MSReport) все равно сабака серая сказал, что не могу вызвать хранимую проц. из функции.
Господа что делать, как можно еще сделать обработку имен файлов по аналогичному принципу? или обработать ошибку в функции?
7 мар 12, 00:06    [12207131]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить