我想在数据库端隔离查询序列的下一个值,因此我的应用程序只需要从视图中查询并获取其唯一的进程ID。
CREATE SEQUENCE SEQ_VID MINVALUE 1 MAXVALUE 2147483647;
CREATE VIEW VID AS SELECT NEXT VALUE FOR SEQ_VID AS ID;
-- I got following error:
-- NEXT VALUE FOR function is not allowed in check constraints, default objects, computed columns, views, user-defined functions, user-defined aggregates, user-defined table types, sub-queries, common table expressions, derived tables or return statements.
虽然该方法在 postgres 和 h2 db上正常工作,但它看起来不适用于sqlserver。
我发现有关sql server here中序列限制的好文章。
所以问题是如何在MS sqlserver的情况下实现从序列中查询的隔离,所以我的应用程序不必是db供应商知道的?
答案 0 :(得分:1)
视图和功能不会引起副作用。这是一件好事,因为它在更大的查询中使用时可以使它们可靠。没有办法规避这个限制。产品团队确保这一点。
即使在技术上可行的情况下使用数据库,您正在做的是反模式。不要在视图中隐藏副作用。
使用过程或直接T-SQL代码。
答案 1 :(得分:1)
SQL Server中的NEXT VALUE FOR
函数有几个限制。其中一个限制是NEXT VALUE FOR
函数无法在视图中使用。
来自NEXT VALUE FOR (Transact-SQL)的文档 - 限制和限制:
NEXT VALUE FOR功能在以下情况下不能使用:
- 在视图中,在用户定义的函数中或在计算列中。
你必须找到另一种做事方式。我建议创建一个存储过程,它将下一个值作为OUTPUT
参数返回。