Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Процедура возвращает не то, что надо


Автор: Kolia 10.1.2006, 15:59
Вот имеем процедуру
Код

ALTER    PROCEDURE tbl.usp_get_need_print_doc_filename
(
    @project_id t_identifier,
    @prtype_id    t_identifier,
    @filename        varchar(255) OUTPUT
)
AS
BEGIN
    DECLARE @doc_id t_identifier
    DECLARE @result_aaa integer
    DECLARE @filename_out varchar(255)

    SET @filename_out = NULL
    DECLARE c_doc_list CURSOR STATIC
                    FOR
                            SELECT
                                        pr_doc.id,
                                        pr_doc.filename
                            FROM
                                        tbl.t_prtype_doc pr_doc WITH(NOLOCK)
                            WHERE
                                        pr_doc.prtype_id = @prtype_id
                                        AND (
                                                    pr_doc.id = 'mn85'
                                                    OR pr_doc.id = 'a2'
                                                    OR pr_doc.id = 'mn95'
                                                    OR pr_doc.id = 'mn96'
                                                )
    OPEN c_doc_list

    FETCH c_doc_list INTO @doc_id, @filename_out

    /*    Probegajem po rezul'tatu SELECT'a    */
    WHILE @@FETCH_STATUS = 0
    BEGIN
        /* вызывается процедура, которая проверяет дополнительные условия. */
        EXECUTE @result_aaa = tbl.usp_need_to_print @doc_id, @project_id, 'L'
        IF @result_aaa > 0
        BEGIN
            SET @filename = @filename_out
            BREAK
        END

        SELECT @doc_id = NULL, @filename_out = NULL
        FETCH c_doc_list INTO @doc_id, @filename_out
    END

    CLOSE c_doc_list
    DEALLOCATE c_doc_list

END


А ета та процедура, которую вызывает предыдущая
Код

ALTER    PROCEDURE tbl.usp_need_to_print
(
    @doc_id t_identifier,
    @param1 t_identifier,
    @type char(1) -- L - leasing, F - factoring
)
AS

DECLARE @sql nvarchar(2000)

IF @type = 'L'
    SET @sql = (select sql_condition from tbl.t_prtype_doc with(nolock) where id = @doc_id)

IF @type = 'F'
    SET @sql = (select sql_condition from tbl.t_factoring_type_doc with(nolock) where id = @doc_id)

EXEC sp_executesql @sql, N'@param1 t_identifier', @param1
return @@ROWCOUNT


Так вот, при вызове usp_get_need_print_doc_filename параметр @filename_out является почему то не таким как надо - "1". Даже если я перед самым концом процедуры напишу SET @filename = 'kol', то все равно ничего не изменится.
Как я понимаю проблема с EXECUTE @result_aaa = tbl.usp_need_to_print @doc_id, @project_id, 'L', но что именно плохо smile smile

Автор: SergeBS 12.1.2006, 14:35
Kolia


SELECT @doc_id = NULL, @filename_out = NULL

Объясни мне, что делает эта строка? Где источник для SELECT?


FETCH c_doc_list INTO @doc_id, @filename_out

Объясни мне, что делает эта строка? Где источник для @filename_out? Вижу только для @doc_id, т.е. @filename_out неявно убивается. Напиши, например
FETCH c_doc_list,1 INTO @doc_id, @filename_out
Для начала.

Автор: Vit 12.1.2006, 16:43
Цитата(SergeBS @ 12.1.2006, 05:35 Найти цитируемый пост)

Kolia


На форумах обращение к конкретному участнику не приветствуется здесь коллективное обсуждение.


Цитата(SergeBS @ 12.1.2006, 05:35 Найти цитируемый пост)

SELECT @doc_id = NULL, @filename_out = NULL

Объясни мне, что делает эта строка? Где источник для SELECT?


Нигде, эта строка присваевает значения переменным @doc_id и @filename_out

Цитата(SergeBS @ 12.1.2006, 05:35 Найти цитируемый пост)

FETCH c_doc_list INTO @doc_id, @filename_out


Вызывает следующую строку курсора и передаёт её в переменные. Подробности: любой букварь по базам данным, глава "Курсоры данных"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)