繁体   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