【发布时间】:2016-07-13 04:07:53
【问题描述】:
我想为我的应用程序中的一项功能生成自定义 ID。以下是执行此操作的过程:
CREATE PROCEDURE [dbo].[GetNextVendorInvoiceNo]
AS
BEGIN
Declare @StartingVendorInvoiceNo int = 0
Select @StartingVendorInvoiceNo = MAX(StartingVendorInvoiceNo) + 1
From SystemSettings WITH (TABLOCK)
Update SystemSettings
Set StartingVendorInvoiceNo = @StartingVendorInvoiceNo
Select @StartingVendorInvoiceNo
END
如果多个用户最终调用此过程会不会有任何问题。显然我不希望多个用户拥有相同的 ID。我正在使用 TABLOCK,但不确定这是正确的方法还是还需要其他任何东西。
【问题讨论】:
-
startingvendorinvoiceno 会改变吗?如果没有,为什么不能有一个标识列呢?
-
因为这是一个更简单的整数版本。我计划稍后使用 varchar 来生成发票,正如我在问题 Identity is not possible 中所建议的那样。
-
为什么不能进行身份验证?如果您所做的只是获取先前的最大值并添加一个,那么您所做的正是身份以一种效率较低的方式所做的事情。
-
@ZLK:你愿意看我的评论吗?我说我打算在 varchar 上执行此操作,因此发票编号可能是 ZXCVA - 都是独一无二的。我希望你明白这在 Identity 中是不可能的。如果您只是回答我的问题,而不是提出在我的情况下不可能的不同方式,我将不胜感激。
-
那么现实地说,你所做的远比它需要的复杂得多(因为你可以在任何你需要显示“ZXCVA”的应用程序中添加“ZXCVA”,但有 ACTUAL字段为整数)。如果您的字段将是 varchar,那么它不像 max+1 那样简单,您必须拆分列中的值,找到整数,然后将其加 1,然后插入它...但实际上,您应该将其保留为 int。
标签: sql sql-server tsql stored-procedures sql-server-2012