我创建了一个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次记录之后它没有工作。
答案 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