Передайте параметр во вложенную процедуру или создайте временную таблицу и проверьте, существует ли таблица - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть следующая структура хранимых процедур:

exec A -> exec B -> exec C -> exec D

, где хранимая процедура A вызывает хранимую процедуру B, B вызывает C и C вызывает D.

Мне нужно специальное поведение, которое должно происходить в хранимой процедуре D на основе условия, которое определяется в хранимой процедуре A. Конечно, один из вариантов - передать параметр из A в B, затем из B в C, затем из C в D, но мне было интересно, могу ли я просто создать временную таблицу перед выполнением A, тогда, когда я нахожусь в хранимой процедуре, DI может просто проверить, существует ли временная таблица и выполнить мои логические операции c на основании этого. Наконец, в строке сразу после exe c A, я удалю временную таблицу

РЕДАКТИРОВАТЬ: я знаю, что если pro c D вызывается из другой процедуры, условие будет рассматриваться как не существует. Также я знаю, что имя временной таблицы может быть sh с другой временной таблицей с тем же именем. Кроме этого ...

Есть ли нежелательные побочные эффекты при выполнении более позднего решения?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Временные таблицы или (#tables) должны иметь продолжительность жизни сеанса. В описываемом вами случае вы сможете создать таблицу # в PRO C A и ссылаться на нее в PRO C D без каких-либо особых соображений.

Обратите внимание, что если вы воспользуетесь этим подходом, вы создадите прямую зависимость между PRO C D и PRO C A, поскольку теперь вам нужно вызвать PRO C A, чтобы создать таблицу Temp, которую вы используется на PRO C D. Если с этим все в порядке, то go впереди.

0 голосов
/ 17 февраля 2020

Я обычно использую постоянную таблицу [Params]. У меня есть процедура:

CREATE OR ALTER PROCEDURE SetParam @name VarChar(20), @value VarChar(50) AS BEGIN
    -- I don't like MERGE, but it could be used here as well.
    BEGIN TRY
        INSERT INTO [Params] ([Name], [Value]) 
        VALUES (@name, @value)
    END TRY
    BEGIN CATCH
        UPDATE [Params] SET [Value] = @Value
        WHERE [Name] = @name
    END CATCH
END
GO
CREATE OR ALTER PROCEDURE GetParam @name VarChar(20), @value VarChar(50) OutPut AS BEGIN
    SET @value = NULL
    -- Try - Catch could be here as well
    SELECT @value FROM [Params] WHERE [Name]=@name
END
GO

-- In A
EXEC SetParam 'Param','Value'

-- In D
DECLARE @ParamValue Int
EXEC GetParam 'ParamName', @ParamValue OutPut
...