2016-09-15 78 views
0

我不確定這是否可能,但我想我會問。如何在執行更新時將params保留爲原始值

我有一個存儲過程,它將在表上執行更新。這個存儲過程有五個參數:

@ClawbackID   int, 
@PaymentID   int, 
@ClawbackDate  date, 
@ClawbackPercent money, 
@ClawbackAmount  money 

因此,當用戶執行過程,他們需要的價值,填補了5個參數。

現在讓我們說這個場合我只想更新2個參數,這意味着我仍然必須爲3個參數輸入相同的值,我不想更改並輸入兩個新值2個參數我想改變。這可能會導致更多人爲錯誤的機會。

我想知道是否有一種方法可以設置,使我不想改變的參數,我只是保持參數名稱和我想要更改的參數,我輸入他們的值?

實施例下面,我改變5個的參數2是:

exec procexample @ClawbackID, @PaymentID, '2017-03-06', @ClawbackPercent, 1540.00 

於是三PARAMS保持其原有的值和輸入的兩個值的變化。

然而,這將需要動態的在另一場合我可能需要更新4個值,則下一時機可能只有1個值等

這可能嗎?

謝謝

回答

1

通常你會通過NULL爲您不想引起改變這些參數的值,然後用邏輯的存儲過程中:

UPDATE t SET 
    t.ClawbackDate=COALESCE(@ClawbackDate, t.ClawbackDate) 
FROM UpdatableTable t 
WHERE <criteria> 

您可以優化進一步,當你完全繞過UPDATE的情況下,所有的參數都是NULL,並WHERE子句中,當有實際的變化,從而記錄只得到更新:

WHERE t.ClawBackDate!=COALESCE(@ClawbackDate, t.ClawBackDate) OR ... 
+0

如果您傳遞NULL作爲值的佔位符而不會更改您將如何處理想要實際使用NULL作爲值的用戶?由於這是一個存儲過程,因此我不這樣做。我會使參數可選。 –

+0

這將如何工作?有沒有辦法區分「參數值NULL」和「參數省略」? 當要更新的列是可爲空的,並且NULL是您需要設置的值時,使用一對參數:一個用於可空值,一位傳遞0忽略和1更新。 – dlatikay

+1

哦,我想我明白了OP想要傳達的信息......他們沒有做好解釋他們實際上想要做的事情。我認爲你的解釋可能實際上是他們需要的。 –

0

我知道這很晚了,但我想清理這個。 (參見代碼中的註釋)

-- Create a Dummy Table/Record to Log Param -- This would be an Actual table 
Declare @LogParam Table (Log_ID int IDENTITY(1,1),PrcName varchar(250),ExecDT DateTime ,UsrID int,ParamXML XML); 
Insert Into @LogParam Values (OBJECT_NAME(@@PROCID),GetUTCDate(),1,'<ClawbackID>25</ClawbackID><PaymentID>5</PaymentID><ClawbackDate>2016-09-01</ClawbackDate><ClawbackPercent>0.5000</ClawbackPercent><ClawbackAmount>50000.0000</ClawbackAmount>'); 

-- In Your Stored Proc Collect Parameters (Let's assume only the ClawbackAmout was passed) 
Declare @UsrID int = 1,@ClawbackID int,@PaymentID int,@ClawbackDate date,@ClawbackPercent money,@ClawbackAmount money = 25000 

-- Collect and Set Values 
Select @ClawbackID  = IsNull(@ClawbackID  ,ParamXML.value('(ClawbackID)[1]'  ,'int')) 
     ,@PaymentID  = IsNull(@PaymentID  ,ParamXML.value('(PaymentID)[1]'  ,'int')) 
     ,@ClawbackDate = IsNull(@ClawbackDate ,ParamXML.value('(ClawbackDate)[1]' ,'date')) 
     ,@ClawbackPercent = IsNull(@ClawbackPercent,ParamXML.value('(ClawbackPercent)[1]','money')) 
     ,@ClawbackAmount = IsNull(@ClawbackAmount ,ParamXML.value('(ClawbackAmount)[1]' ,'money')) 
From @LogParam 
Where UsrID = @UsrID 
    and IsNull(PrcName,'') = IsNull(OBJECT_NAME(@@PROCID),'') 
Order By Log_ID Desc 

-- Log Latest Parameters 
Insert Into @LogParam values (OBJECT_NAME(@@PROCID),GetUTCDate(),@UsrID,(Select ClawbackID = @ClawbackID,PaymentID = @PaymentID,ClawbackDate = @ClawbackDate,ClawbackPercent = @ClawbackPercent,ClawbackAmount = @ClawbackAmount For XML Path(''))) 


-- Just to Illustrate Current Log and Current Parameters 
Select * from @LogParam 
Select @ClawbackID 
     ,@PaymentID 
     ,@ClawbackDate 
     ,@ClawbackPercent 
     ,@ClawbackAmount 

結果

enter image description here

的PrcName爲NULL,但會被調用程序名稱

您也可能會注意到的成本收集和保存只有3毫秒。