2012-02-13 2 views
0

계산 된 열에서 사용하는 함수 'DiffMinuti'가 있습니다. 변수로 선언하고, 한 번만 호출하고 코드를 최적화하고 싶습니다. 도와 주셔서 감사합니다.SQL Server : 계산 열 내에서 함수를 변수로 선언하는 방법

ALTER TABLE Ticket ADD MinutiAllaScadenza AS (" + 
CASE 
WHEN StatoTicketID > 3 AND dbo.DiffMinuti(DataArrivo, DataObiettivo) <0 THEN 10000000 
ELSE dbo.DiffMinuti(DataArrivo, DataObiettivo) 
END) 

감사합니다. 최고 감사합니다

답변

1

DiffMinuti 결과를 저장하기 위해 새 필드를 추가하고 값을 최신 상태로 유지하기 위해 INSERT 및 UPDATE 트리거를 사용하고 MinutiAllaScadenza 계산 된 필드에서 새 필드를 참조하면됩니다 (함수를 호출하는 대신 매번). 이 같은

뭔가 : 당신은 계산 열 표현에서 직접이 작업을 수행 할 수

ALTER TABLE Ticket ADD DiffMinuti INT NULL 
GO 
CREATE TRIGGER trg_Ticket_DiffMinuti ON Ticket 
AFTER INSERT, UPDATE 
AS 
BEGIN 

    SET NOCOUNT ON; 

    IF UPDATE(DataArrivo) OR UPDATE(DataObiettivo) 
    BEGIN 

     UPDATE 
      b 
     SET 
      DiffMinuti = dbo.DiffMinuti(DataArrivo, DataObiettivo) 
     FROM 
      INSERTED a INNER JOIN 
      Ticket b ON a.TicketID = b.TicketID; 

    END; 

END; 
GO 
ALTER TABLE Ticket ADD MinutiAllaScadenza AS CASE WHEN StatoTicketID > 3 AND DiffMinuti <0 THEN 10000000 ELSE DiffMinuti END 
GO 
+0

@domanager을 표현 포장해야 할 것 : 대단히 감사합니다! 나는 그것이 매우 복잡하다고 생각하지 않았습니다 ... MinutiAllaScadenza 계산 된 필드를 계산하는 가장 효율적인 방법은 무엇이라고 생각합니까? "Diffminuti"함수에 대한 이중 호출로 사용자가 설명하거나 현재 사용하고있는 것입니까? 고맙습니다. 매우 철저하고 전문적입니다! – Larry

+0

@Larry 대량 삽입/업데이트가 많고 테이블에서 읽는 방법이 거의 없으면 메서드가 더 좋을 수도 있지만 데이터가 상당히 정적이며 쿼리가 발생하는 경우에는 테이블 사용 방법에 따라 달라집니다 무겁게 반환 된 각 행에 대한 함수를 호출하지 않아도됩니다 더 효율적이어야합니다. – domager

+0

@domager : 이제 최악의 경우에 DiffMinuti에 대한 2 차 테이블에 나머지 계산 된 열에 대한 RBAR 처리가 있습니다 ... – gbn

2

: 당신은 다른 함수에

+0

THX @gbn ... 위의 domanager의 대답을 참조하십시오. 이제 나는 그것을하는 가장 효율적인 방법에 의문을 가지고 있습니다 ... – Larry

+0

@Larry : 저는 개인적으로 계산 된 컬럼을 유지할 것입니다. 그리고 나는 그것도 그대로 유지하고 여분의 기능을 신경 쓰지 않아도됩니다. 트리거 이전 *와 * 계산 된 열을 사전 도우미의 응답으로 사용하는 것은 idiocy IMO – gbn

+0

THX @gbn입니다. 적어도 내 경우에는 트리거를 사용하여 새로운 계산 필드를 만드는 것이 너무 많은 것처럼 보입니다 ... 공연의 실제 이점이 없으면 ... 다른 사람들이 생각하고 결정하는 것을 보겠습니다 ... 다시 한 번 감사드립니다! – Larry