[英]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.