将参数传递给嵌套过程或创建临时表并检查表是否存在



我有以下存储过程结构:

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

其中存储过程 A 调用存储过程 B,B 调用 C,C 调用 D。

我需要根据存储过程 A 中确定的条件在存储过程 D 中发生特殊行为。当然,一种选择是将参数从 A 传递到 B,然后从 B 传递到 C,然后从 C 传递到 D,但我想知道我是否可以在执行 A 之前简单地创建一个临时表,然后当我在存储过程 D 中时,我可以检查临时表是否存在并基于此执行我的逻辑。最后在执行 A 之后的行中,我将删除临时表

编辑:我知道,如果从不同的过程调用proc D,则条件将被视为不存在。我也知道临时表名称可能会与另一个同名的临时表冲突。除此之外...

做后面的解决方案有什么不必要的副作用吗?

临时表或 (#tables( 应具有会话的生命周期。在您描述的情况下,您应该能够在 PROC A 中创建 #table 并在 PROC D 上引用它,而无需任何特殊注意事项。

请注意,如果采用此方法,则会在 PROC D 和 PROC A 之间创建直接依赖关系,因为现在您必须调用 PROC A 来创建在 PROC D 上使用的 Temp 表。如果您对此感到满意,请继续。

我通常使用持久性[参数]表。我有程序:

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

最新更新