Sql-Server
使用函式創建持久計算列
我正在與程序員一起開發數據庫解決方案。他們希望添加一個計算列來模擬舊查詢、過程和系統的舊鍵並對其進行索引。新鍵將是 GUIDS。
為此,他們希望為計算列創建一個函式,該函式創建一個值並將其持久化。它不會讓他們保留該列。我對這個想法沒有任何熱情的模糊,我也無法在網上找到任何關於該技術的資訊(它是一種技術嗎?)。
我認為他們需要添加一個觸發器。有沒有人有任何想法?
該函式將按以下方式執行:
(SELECT [INT Identity field] FROM TABLE WHERE [GUID COLUMN] = @GUIDKEY
它根據 GUID 返回一個 INT 身份欄位。
這將在插入相關表時執行。因此,如果表一持有主鍵,則相關表二將更新(使用傳入的 GUID)以從表一中獲取鍵並將其插入表二。
仍然不明白為什麼這需要成為表中的一列,更不用說持久化的列了。
為什麼不創建一個表值函式,當(且僅當)查詢真正需要它時交叉應用?由於舊密鑰永遠不會改變,因此無論如何都不需要計算或持久化它。
如果您真的希望舊密鑰存在於多個地方(聽起來不應該做出這種決定的人已經做出了這種決定),只需在觸發器中進行查找並在寫入時填充它. 那麼它只是表中的一個靜態列。
我仍然強烈推荐一個表值函式來促進這一點,這樣您就可以編寫觸發器以處理多行操作……而無需編寫循環或呼叫標量值函式每一行都重來一遍。
只是為了展示這些東西實際上有多相似(並質疑“不喜歡它”的首席開發人員):
-- bad, slow, painful row-by-row CREATE FUNCTION dbo.GetIDByGUID ( @GuidKey uniqueidentifier ) RETURNS int AS BEGIN RETURN (SELECT $IDENTITY FROM dbo.tablename WHERE guid_column = @GuidKey); END GO -- in the trigger: UPDATE r SET oldkey = dbo.GetIDByGUID(i.guid_column) FROM dbo.related AS r INNER JOIN inserted AS i ON r.guid_column = i.guid_column;
現在,如果您有一個表值函式,程式碼非常相似,但是您會發現多行操作的性能要好得多,而單行操作的性能幾乎相同。
-- ah, much better ALTER FUNCTION dbo.GetIDByGUID_TVF ( @GuidKey uniqueidentifier ) RETURNS TABLE AS RETURN (SELECT id = $IDENTITY FROM dbo.tablename WHERE guid_column = @GuidKey); GO -- in the trigger: UPDATE r SET oldkey = f.id FROM dbo.related AS r INNER JOIN inserted AS i ON r.guid_column = i.guid_column CROSS APPLY dbo.GetIDByGUID_TVF(i.guid_column) AS f;