sql server的linked server支持使用sequence吗?
sql server 2012开始支持序列(sequence),今天遇到有个同事咨询,能否在linked server里面调用seqence, 结果我测试发现不行,但是不管官方文档也好,网上相关资料也罢,都没有说支持,也没有说不支持。
例如官方文档next value for (transact-sql)中明确表示那些情况不支持使用序列的next value for函数。(如下所示,没有提及linked server)
不能在下列情况下使用 next value for 函数:
· 数据库处于只读模式时。
· 作为表值函数的参数。
· 作为聚合函数的参数。
· 在子查询中,包括公用表表达式和派生表。
· 在视图、用户定义的函数或计算列中。
· 在使用 distinct,union ,union all,except或intersect 运算符的语句中。
· 在使用 order by 子句的语句中,除非使用了 next value for …over (order by …)。
· 在以下子句中:fetch,over,output,on,pivot,unpivot,group by,having,compute,compute by 或 for xml。
· 在使用 case,choose,coalesce,iif,isnull或nullif 的条件表达式中。
· 在不属于 insert 语句的 values 子句中。
· 在检查约束的定义中。
· 在规则或默认对象的定义中。 (它可用于默认约束。)
· 作为用户定义表类型中的默认值。
· 在使用 top、offset 的语句中,或在设置 rowcount 选项时。
· 在语句的 where 子句中。
· 在 merge 语句中。 (在目标表的默认约束中使用 next value for 函数并且在 merge 语句的 create 语句中使用默认值的情况下例外。)
如下所示,这种写法是不支持的(ssms中执行会直接报错),查了大量的资料,发现没有什么资料涉及这方面(当然,这种需求本身也是不合理的)。所以,经过验证、测试,可以明确的是: sql server中linked server不支持使用sequence。
select next value for [link_server_name].yoursqldba.dbo.test_seq;
简单测试,发现可以使用openquery来解决这个问题。如下所示:
select from openquery([link_server_name], 'select next value for yoursqldba.dbo.test_seq');
另外,也可以将序列放到存储过程中,通过连接服务器调用存储过程,间接调用sequence。
create procedure prc_test
as
begin
select next value for dbo.test_seq;
end
exec [link_server_name].yoursqldba.[dbo].prc_test
参考资料:
https://docs.microsoft.com/en-us/sql/t-sql/functions/next-value-for-transact-sql?view=sql-server-2017