自动增量将varchar数据类型设置为主键

时间:2014-04-29 20:45:30

标签: asp.net sql stored-procedures database-design type-conversion

我创建了一个Id列为varchar(20)的表格。

我需要一个可以将id递增1的存储过程。

我试过这个:

ALTER PROCEDURE dbo.spInsertCatQuery
    (@Users_Id varchar(20),
     @Cat_Id varchar(20),
     @Query varchar(100),
     @Query_Title varchar(50)
)
AS
BEGIN
    Declare @Query_Id bigint

    SELECT @Query_Id = coalesce((select max(Query_Id) + 1 from tblCatQuery), 1);

    INSERT INTO tblCatQuery 
    VALUES(@Query_Id, @Users_Id, @Cat_Id, @Query_Title, @Query) 
END

但是在第10次记录之后它没有工作。

4 个答案:

答案 0 :(得分:1)

Query_id的选择从您的表格更改为

SELECT @Query_Id= 
coalesce((select max(cast(Query_Id as int)) + 1 from tblCatQuery), 1);

根据戈登的评论;我的理解是,因为ID是varchar max(id)没有获取正确的最大值,但是转换它会这样做。

例如试试这个

create table testtab (id varchar(10));

insert into testtab values(2),(200),(53)

如果你说下面会返回53

select MAX(id) from testtab

但这个将返回200

select MAX(cast(id as int)) from testtab

SQL SERVER 2008 R2

中测试过

答案 1 :(得分:1)

你知道你的存储过程有一个隐含的竞争条件,不是吗?

在计算新查询ID和提交表插入之间,可以进入另一个会话,获取完全相同的查询ID ,插入并提交。猜猜插入尝试提交时会发生什么?胜利第一;第二个得到重复键错误。不要问我怎么知道这个:)。

如果您确实需要文本查询ID,可以尝试使用计算字段,如下所示:

create table dbo.tblCatQuery
(
  query_id      int not null identity(1,1) primary key clustered ,
  query_id_text as right('0000000000'+convert(varchar,id),10) ,
  user_id       varchar(20)  not null ,
  cat_id        varchar(20)  not null ,
  query         varchar(100) not null ,
  query_title   varchar(50)  not null ,
)

然后您的存储过程如下所示:

create procedure dbo.spInsertCatQuery

  @Users_Id    varchar(20)  ,
  @Cat_Id      varchar(20)  ,
  @Query       varchar(100) ,
  @Query_Title varchar(50)  ,
  @Query_ID    varchar(10)  output

AS

  insert dbo.tblCatQuery ( user_id   , cat_id  , query_title  , query  )
  VALUES                 ( @Users_Id , @Cat_Id , @Query_Title , @Query )

  -- give the caller back the id of the row just inserted
  set @Query_ID = @@SCOPE_IDENTITY

  -- for redundancy, hand it back as the SP's return code, too
  return @Query_ID

GO

答案 2 :(得分:0)

听起来你的应用程序需要一个ID字段的字符串,但在数据库中你希望它的ID表现为一个自动递增的整数字段。

考虑在数据库中使用整数,当您检索该值并需要将其用作字符串时,此时将值转换为字符串,无论是在查询中还是在应用程序中。

这将解决您的问题。

答案 3 :(得分:0)

您必须认真审核您的设计。我会建议这样的事情。

CREATE TABLE tblCatQuery(QueryId int NOT NULL PRIMARY KEY IDENTITY(1, 1), 
        UserId int NOT NULL REFERENCES tblUsers(UserId),
        CatId int NOT NULL REFERENCES tblCat(CatId),
        Query varchar(100), Query_Title varchar(50))

CREATE TABLE tblUsers(UserId int NOT NULL PRIMARY KEY IDENTITY(1, 1), ....
CREATE TABLE tblCat(CatId int NOT NULL PRIMARY KEY IDENTITY(1, 1), ....

CREATEPROCEDURE dbo.spInsertCatQuery
(
        @Users_Id int,
        @Cat_Id int,
        @Query varchar(100),
        @Query_Title varchar(50)
)
AS
BEGIN
    INSERT INTO tblCatQuery(Users_Id, Cat_Id, Query_Title, Query)
    VALUES( Users_Id, Cat_Id, Query_Title, Query) 
END