[英]How to convert sql_variant so it can be considered deterministic
我正在嘗試在SYSTEM_VERSIONING
表dbo.Users
中創建一個持久計算列,如下所示:
ALTER TABLE dbo.Users
ADD SessionId AS usr.GetSession() PERSISTED
CONSTRAINT FK_dboUsers_IdSession
FOREIGN KEY REFERENCES dbo.Sessions(IdSession)
usr.GetSession()
只是在SESSION_CONTEXT('IdSession')
中檢索存儲為BIGINT
的值並將其再次轉換為BIGINT
。
CREATE OR ALTER FUNCTION usr.GetSession()
RETURNS BIGINT WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(BIGINT, SESSION_CONTEXT(N'IdSession'))
END
但收到以下錯誤:
無法保留表“用戶”中的計算列“會話 ID”,因為該列是不確定的。
很明顯是因為:
SELECT OBJECTPROPERTY(OBJECT_ID('usr.GetSession'), 'IsDeterministic') AS IsDeterministic;
正在返回0
一點點搜索發現這個關於確定性和非確定性函數
兌換
確定性,除非存在以下條件之一:
- 源類型是 sql_variant。
- 目標類型是 sql_variant,其源類型是不確定的。
所以,我知道沒有辦法讓我的計算列與用戶定義的標量 function 保持一致,因為sql_variant
不能作為確定性值處理。
或者可以到處走走來解決我的問題? 還是其他解決方案? 任何想法?
不,沒有解決方法。 除非您轉換它(甚至是隱式轉換),否則您無法對sql_variant
執行任何操作,並且正如您所提到的,這不是確定性的。
盡管如此,你似乎還是走錯了路。
計算列在這里是錯誤的,因為在這種情況下,每次讀取它都會更改,而您似乎希望每次插入行時都更改它。
相反,您需要一個DEFAULT
ALTER TABLE dbo.Users
ADD SessionId bigint DEFAULT (usr.GetSession())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.