Sql-Server

忽略儲存過程中的 Null(可選)變數

  • November 21, 2019

我正在尋找無需大量編碼即可輕鬆實現的目標。

我有一個儲存過程可以做一些工作,並且有大約 20 個可選參數:

CREATE PROCEDURE dowork 
                @param1_1=NULL, 
                @param1_2=NULL
                .....@Param1_30=NULL

我正在實現另一個過程,它將呼叫那個過程,理想情況下,我想提供所有參數,但只使用已設置的參數:

CREATE PROCEDURE CallWork 
                @param1=NULL, 
                @param2=NULL
                .....@Param30=NULL
AS BEGIN
--Do some stuff
EXEC dowork 
    @param1_1=@param1, 
    @param1_2=@param2
    .....@Param1_30=@Param30

上面的範例會按原樣工作,還是我需要創建某種變數來保存所有“設置”參數?

參數是靜態的。我以數字 1 到 30 為例,但它們都是靜態的。範例:@StartTime, @EndTime,@Type@Location

目前dowork,根據參數的輸入處理一個批次。對於某些工作負載,我需要它來處理每批,一次一個,而不是同時處理所有。

通過創建一個抽象過程,我計劃創建一個表變數來為每個批次保存一行,然後將它們逐個傳遞,從而允許在某些情況下對我們需要的每個批次進行更多控制。然後,這將使原始過程像批量作業需要時那樣執行。

如果您將給定參數的值設置為其預設值(當它有一個時),您將獲得與省略它相同的功能。因此,我建議執行以下操作:

EXEC dowork 
   @param1 = ISNULL(@param1, SELECT default_value FROM sys.parameters p WHERE object_Id = OBJECT_ID('dowork') AND name = '@param1' AND has_default_value = 1),
   @param2 = ISNULL(@param2, SELECT default_value FROM sys.parameters p WHERE object_Id = OBJECT_ID('dowork') AND name = '@param2' AND has_default_value = 1),
   ...@param30 = ISNULL(@param30, SELECT default_value FROM sys.parameters p WHERE object_Id = OBJECT_ID('dowork') AND name = '@param30' AND has_default_value = 1)

唯一的缺陷是沒有預設值的值,這將導致傳遞 NULL vs 導致省略時會發生的錯誤。如果在您的特定情況下這是一個問題,我會事先進行一些檢查並拋出錯誤。

我可以建議的唯一其他選擇是動態 SQL。

引用自:https://dba.stackexchange.com/questions/228684