SQL 服务器 - 视图后面的序列

SQL Server - sequence behind the view

我想在数据库端隔离查询序列的下一个值,这样我的应用程序只需要从视图中查询并获得其唯一的进程 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.

虽然该方法在 postgresh2 db 上工作正常,但它看起来不适用于 sql服务器。
我发现 post 关于 sql 服务器 here 中序列的限制很好。

所以问题是,在 MS sql服务器的情况下,我如何实现从序列中隔离查询,所以我的应用程序不必是数据库供应商感知的?

视图和函数不能产生副作用。这是一件好事,因为它使它们在更大的查询中使用时变得可靠。没有办法规避此限制。产品团队会确保这一点。

即使在技术上可行的情况下使用数据库,您所做的也是一种反模式。不要在视图中隐藏副作用。

使用程序或直接T-SQL代码。

SQL服务器中的NEXT VALUE FOR函数有几个限制。这些限制之一是 NEXT VALUE FOR 函数不能在视图中使用。

来自 NEXT VALUE FOR (Transact-SQL) 上的文档 - 限制和限制:

The NEXT VALUE FOR function cannot be used in the following situations:

  • In views, in user-defined functions, or in computed columns.

您将不得不寻找另一种做事方式。我建议创建一个存储过程,它将 return 下一个值作为 OUTPUT 参数。