【发布时间】:2017-05-15 21:36:57
【问题描述】:
我在 sql server 2008 中有存储过程,我的存储过程计算并从表 B 的列中获取最后一个数字“非主键”,然后在该数字上加一个 (+1) 以在下一条语句中使用它相同的存储过程。
我的问题是我有时有重复的号码,我认为这发生在多个用户同时调用存储过程时。这是问题吗,我该如何解决它
我的代码如下:-
DECLARE @ID AS NVARCHAR(10)
SET @ID = (
SELECT TOP 1 MyNo
FROM Employee
WHERE (
(TypeID = @TypeID) AND
(Year = @Year)
)
ORDER BY ID DESC
)
SET @ID = ISNULL(@ID,0) + 1
INSERT INTO Employee (name,lname,MyNo) VALUES (@name,@lname,@MyNo)
【问题讨论】:
-
不好,你的桌子上应该有PK
-
这种“自己动手”的身份替换是一种反模式。它充满了错误。为什么哦,为什么要对这个值进行数学运算,然后将其存储在 nvarchar(10) 中?您应该修复您的架构。将列的数据类型更改为 int 并使用标识属性。其他任何事情都会在某个时候遇到问题。
-
谢谢大家。但这是一个示例代码,而不是实际代码。实际代码是 varcharchar(10) 因为 no 类似于这个 no-year 示例 123-2017 而 123 是我生成它的增量 no,它不依赖于主键。
-
为什么不添加另一个标识列?
-
@KannanKandasamy 正如我之前提到的,数字的计算取决于许多条件和类型,不能是一个身份
标签: sql sql-server tsql stored-procedures