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.
虽然该方法在 postgres 和 h2 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
参数。
我想在数据库端隔离查询序列的下一个值,这样我的应用程序只需要从视图中查询并获得其唯一的进程 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 上工作正常,但它看起来不适用于 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
参数。