如何在 SQL Server 2008 中创建序列

问题描述 投票:0回答:7

我正在使用以下代码在 SQL Server 中创建序列。但它将错误显示为未知对象类型。请给出解决方案

这是我的代码:

create sequence seqval start with 100 increment by 1 minvalue 0 maxvalue 0 no cycle  
 no cache;

提前致谢

sql-server sql-server-2008 sequence
7个回答
9
投票

你可以做到这一点。

--Create a dummy TABLE to generate a SEQUENCE. No actual records will be stored.
CREATE TABLE SequenceTABLE
(
    ID BIGINT IDENTITY  
);
GO

--This procedure is for convenience in retrieving a sequence.
CREATE PROCEDURE dbo.GetSEQUENCE ( @value BIGINT OUTPUT)
AS
    --Act like we are INSERTing a row to increment the IDENTITY
    BEGIN TRANSACTION;
    INSERT SequenceTABLE WITH (TABLOCKX) DEFAULT VALUES;
    ROLLBACK TRANSACTION;
    --Return the latest IDENTITY value.
    SELECT @value = SCOPE_IDENTITY();
GO

--Example execution
DECLARE @value BIGINT;
EXECUTE dbo.GetSEQUENCE @value OUTPUT;
SELECT @value AS [@value];
GO

2
投票

创建一个

Numbers
表;这是一个关于这个主题的SO问题。让我们称之为
dbo.Number
.

有一个带有标识列的表。将种子和步骤设置为适当的:

create table dbo.SequenceGenerator(ID int identity(1, 1), dummy int);

然后从数字表中插入值并捕获新生成的标识值:

declare @HowMany int = 3;  -- This determines how large a sequence you receive
                           -- at each itteration
declare @NewSequenceValue table (ID int);

insert dbo.SequenceGenerator(dummy)
output INSERTED.ID 
    into @NewSequenceValue
select Number from dbo.Numbers
where Number <= @HowMany;

select * from @NewSequenceValue;

一定要不时

DELETE .. dbo.SequenceGenerator
,否则它会变大而没有额外价值。不要
TRUNCATE
它-这会将
IDENTITY
列重置为其初始声明的种子值。


2
投票

SQL Server 2008 无法创建序列,Sequence 对象适用于 SQL Server 2012 到当前版本。

https://msdn.microsoft.com/es-es/library/ff878091(v=sql.120).aspx

您可以在表中使用 IDENTITY,例如:

CREATE TABLE Person(
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Name varchar(255) NOT NULL
);

IDENTITY的起始值为1,每增加一条记录就加1

http://www.w3schools.com/sql/sql_autoincrement.asp


1
投票
WITH N0 as (SELECT 1 as n UNION ALL SELECT 1)
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2)
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2)
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2)
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N3)
SELECT * FROM nums

0
投票

我们不能在SQL Server 2008中方便的使用Sequence.

您可以在 SQL Server 2008 中使用 CTE(通用表表达式)进行序列生成

WITH NUM_GEN (n) AS
     ( 
            SELECT 1 
            UNION 
                  ALLSELECT n+1 
            FROM  NUM_GEN 
            WHERE n+1< MAX_VALUE 
     ) 
SELECT n 
FROM   NUM_GEN

0
投票

看这里 https://www.learnjavaupdate.com/2023/04/sequence-in-sql.html

创建序列 company_seq

START WITH 100

INCREMENT BY 1

MAXVALUE 999

NOCACHE

NOCYCLE;

上面的脚本创建了一个名为“company_seq”的序列,它从 100 开始,并在每次后续调用 NEXTVAL 函数时递增 1。该序列的最大值为 999,这意味着一旦序列达到 999,它将停止产生值。 NOCACHE 选项指定 Oracle 不应缓存序列值,NOCYCLE 选项指定序列在达到最大值时不应循环回其起始值。

创建序列后,您可以使用 NEXTVAL 函数生成唯一值:

插入公司(company_id,company_name)

VALUES (company_seq.NEXTVAL, 'Dummy');


-3
投票

你确定你跑的是2012吗?我没有遇到任何问题:

CREATE SEQUENCE seqval
START WITH 100
INCREMENT BY 1 
minvalue 100 maxvalue 10000 NO CYCLE

你的 0,0 值对我产生了一个语法错误,但是一个清晰而简单的错误。

The minimum value for sequence object 'seqval' must be less than its maximum value.
© www.soinside.com 2019 - 2024. All rights reserved.