2016-09-15 2 views
0

이것이 가능한지 확실하지 않지만 어쨌든 묻습니다.업데이트를 수행 할 때 매개 변수를 원래 값으로 유지하는 방법

테이블에서 업데이트를 수행하는 저장 프로 시저가 있습니다. 이 저장 프로 시저에는 5 개의 매개 변수가 있습니다.

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

따라서 사용자가 프로 시저를 실행하면 5 개의 매개 변수 값을 채워야합니다.

이제이 경우에 매개 변수 중 2 개만 업데이트하려고합니다. 변경하지 않으려는 3 개의 매개 변수에 대해 동일한 값을 입력해야한다는 것을 의미합니다. 2 개의 매개 변수를 변경하고 싶습니다. 이것은 인간의 실수 가능성을 더 높일 수 있습니다.

매개 변수가 변경되지 않도록 매개 변수 이름과 매개 변수 이름을 유지할 수있는 방법이 있는지 궁금합니다. 값을 입력하고 싶습니다. I는 5 개 2 파라미터 변경 곳 아래

예는 다음

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

그래서 세 PARAMS 그들의 원래의 값을 유지하고 입력 된 두 값이 변경된다. 내가 4 개 값을 업데이트 할 수 있습니다

그러나 이것은 또 다른 기회에 동적 될 필요가있을 것이다, 다음 기회가 될 수에만 1 개 값 등

이 가능합니까?

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

당신은 최적화 할 수 있습니다

당신이 변화를 유발하지 않는 매개 변수의 값으로 NULL을 통과 한 다음 저장 프로 시저 내부 로직을 사용

보통

답변

1

주셔서 감사합니다 즉, 모든 매개 변수가 NULL이고 WHERE 절인 경우 을 우회하면 실제 변경 사항이있을 때만 레코드가 업데이트됩니다.

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

NULL을 값 대신 자리 표시 자로 전달하면 NULL을 실제로 값으로 사용하려는 사용자를 어떻게 처리하겠습니까? 이것은 저장 프로 시저이므로 이것이 어떻게 할 것인가가 아닙니다. 필자는 매개 변수를 선택적으로 만들 것입니다. –

+0

어떻게 작동합니까? "매개 변수 값 NULL"과 "매개 변수 생략"을 구별 할 수있는 방법이 있습니까? 업데이트 할 열이 nullable이고 NULL이 설정해야하는 값인 경우 각 열 쌍의 매개 변수로 작업합니다. 하나는 nullable 값이고 다른 하나는 무시하기 위해 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 

는 PrcName가 NULL

enter image description here

결과 (코드의 주석을 참조)하지만

당신은 또한의 비용을 알 수 있습니다 프로 시저 이름을 호출하는 것 수집 및 저장은 겨우 3ms였습니다.

관련 문제