簡體   English   中英

如何轉換 sql_variant 使其可以被認為是確定性的

[英]How to convert sql_variant so it can be considered deterministic

我正在嘗試在SYSTEM_VERSIONINGdbo.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM