Sql-Server
忽略儲存過程中的 Null(可選)變數
我正在尋找無需大量編碼即可輕鬆實現的目標。
我有一個儲存過程可以做一些工作,並且有大約 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。