SQL Server - 视图后面的序列

时间:2015-04-13 08:58:30

标签: sql sql-server sequence

我想在数据库端隔离查询序列的下一个值,因此我的应用程序只需要从视图中查询并获取其唯一的进程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供应商知道的?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

SQL Server中的NEXT VALUE FOR函数有几个限制。其中一个限制是NEXT VALUE FOR函数无法在视图中使用。

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

  

NEXT VALUE FOR功能在以下情况下不能使用:

     
      
  • 在视图中,在用户定义的函数中或在计算列中。
  •   

你必须找到另一种做事方式。我建议创建一个存储过程,它将下一个值作为OUTPUT参数返回。