在SQL Server中使用序列

时间:2016-08-02 22:18:12

标签: sql-server sql-server-2012

我正在尝试创建一个带有表MiCliente的序列,如果存在这个序列必须消除,必须逐个并且有一个循环,它需要从1000开始。我需要关联序列列MiCliente.idCliente

CREATE TABLE dbo.MiCliente
(
    idCliente          int             NOT NULL,
    idMunicipio        int             NOT NULL,
    cedula             varchar(20)     NOT NULL,
    nombres            varchar(100)    NOT NULL,
    apellidos          varchar(100)    NOT NULL,
    idSexo             char(1)         NULL,
    idEstadoCivil      tinyint         NULL,
    fechaNacimiento    date            NULL,
    telefono           varchar(20)     NULL,
    celular            varchar(20)     NULL,
    direccion          varchar(100)    NULL,
    email              varchar(100)    NULL     
);
GO

Create Sequence Conteo  
AS tinyint   
START WITH 1000   
INCREMENT BY 1   
GO

当我执行查询时,我收到了

  

错误343

2 个答案:

答案 0 :(得分:0)

我想也许一个身份领域可以最好地解决你的问题。您无法将序列与表字段关联起来;至少不是定义。一个序列可以用作一种"计数器"对象,可以为表调用以生成插入表中的值。

(这里是关于使用序列的一个很好的讨论: https://www.simple-talk.com/sql/learn-sql-server/sql-server-sequence-basics/

例如,使用您在示例中创建的序列(请记住,作为ZLK注释,tinyint用于0到255之间的值;您应该使用int)可以说:

select (next value for Conteo) idCliente, cedula, email from dbo.MiCliente;

或类似

INSERT INTO MiCliente
(idCliente, idMunicipio, cedula, nombres, apellidos)
VALUES
(NEXT VALUE FOR Conteo, 1,'test','Smith','test2');

这样可行,但也可以为另一个表引用相同的序列。因此,它并没有特别关联"到你的桌子。但这可能无关紧要。

另一方面,您可以将idCliente设置为标识字段,使其也以1000开头。这是"绑定"到了桌子,在我看来,更容易使用。这个数字会自动生成。

所以你可以这样做:

Alter table dbo.MiCliente add idCliente INT IDENTITY(1000,1)

然后你也可以把它作为你的主键:

alter table dbo.MiCliente add constraint PK_MiCliente PRIMARY KEY(idCliente)

答案 1 :(得分:0)

当我执行您的查询时,它只会出现以下错误:

  

Msg 11708,Level 16,State 1,Line 2
  为给定数据类型的参数“START WITH”指定了无效值。

很明显,您在创建序列时使用了错误的数据类型tinyint。将其更改为int可以解决您的问题。这是修改后的查询。希望这有帮助!

Create Sequence Conteo  
AS int   
START WITH 1000   
INCREMENT BY 1   
GO

我可以在进行此更改后成功创建序列。我在SQL Server 2012上。