Sql-Server

使用函式創建持久計算列

  • May 13, 2018

我正在與程序員一起開發數據庫解決方案。他們希望添加一個計算列來模擬舊查詢、過程和系統的舊鍵並對其進行索引。新鍵將是 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;

引用自:https://dba.stackexchange.com/questions/204545