2012-02-13 25 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 2012-02-13 13:49:12

+0

@Larry它真的取決於表的使用方式,如果有大量的批量插入/更新和從表中讀取很少數據的方法會更好,但是如果數據相當靜態並且被查詢很大程度上,不必爲返回的每一行調用函數應該更有效率。 – domager 2012-02-13 14:19:10

+0

@domager:你現在有餘數的計算列在最後的計算列在2ndary寫入DiffMinuti的表在最壞的情況下... – gbn 2012-02-13 14:21:11

2

你不能在計算列表達式直接做到這一點:你必須來包裝表達另一個函數

+0

THX @gbn ...我看到上面domanager的答案。現在我懷疑最有效的方法來做到這一點... – Larry 2012-02-13 13:50:41

+0

@Larry:我會保留計算列個人。而且我會保持它的樣子,不用擔心額外的功能。使用觸發器*和*計算列作爲前domager的答案是idiocy IMO – gbn 2012-02-13 13:55:20

+0

THX @gbn。至少在我的情況下,用觸發器創建一個新的計算場似乎太多了......除非有實際的演出效果......讓我們看看其他人的想法和決定......再次感謝! – Larry 2012-02-13 14:17:57