我正在尝试创建一个包装 change_tracking_min_valid_version(object_id) 的函数,以在使用同义词而不是表名时简化查询。像这样的东西:
CREATE FUNCTION MY_CHANGE_TRACKING_MIN_VALID_VERSION(@synonym VARCHAR(100))
RETURNS BIGINT
BEGIN
RETURN (SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(base_object_name))
FROM sys.synonyms WHERE name = @synonym);
END
我已经尝试单独获取基础对象名称,以便能够删除返回语句的选择部分,即
set @retval = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(@table_name))
MS SQL Server Management Studio 产生此错误:
Msg 443, Level 16, State 1, Procedure MY_CHANGE_TRACKING_MIN_VALID_VERSION, Line 5
Invalid use of a side-effecting operator 'change_tracking_min_valid_version' within a function.
我确实知道我不能在函数中使用带有副作用的操作,但是由于我似乎无法找到有关(或理解为什么会有任何)此特定函数的副作用的任何信息,所以我的问题是:
CHANGE_TRACKING_MIN_VALID_VERSION 的副作用是什么?
(我使用的是 SQL Server 2012。)
正如 Aaron 所提到的,这个逻辑可以在视图而不是函数中完成。但是,如果您确实需要使用函数,则替代方法可能是使用
sys.change_tracking_tables
而不是CHANGE_TRACKING_MIN_VALID_VERSION
. 它有一个min_valid_version
专栏,据我从文档中可以看出,它提供了您正在寻找的相同信息。CHANGE_TRACKING_MIN_VALID_VERSION 的副作用是什么?
据我从文档中可以看出,没有任何“副作用”会对您产生有意义的影响。正如 Aaron 所提到的,如果您尝试
NEWID
在函数中使用,您会得到同样的错误。在这两种情况下,我都会怀疑(但不确定)NEWID
并且CHANGE_TRACKING_MIN_VALID_VERSION
正在访问和/或修改内部数据结构(例如,NEWID
在.