创建非Int和非Guid唯一标识符

时间:2012-02-17 16:32:15

标签: sql-server sql-server-2008 tsql

我正在寻找一种方法SQL Server可以生成一个不是增量Int或GUID的唯一标识符。

唯一ID可以是字母和数字的组合,没有其他字符,如前所述必须是唯一的。

AS93K239DFAK

如果可能,必须始终以AS开头,或以K

结束

如果有Insert个GUID并且IsIdentity = Yes,则可以自动生成此唯一ID。它可以是一个随机数,在应用程序中没有预先确定。

是否可以做这样的事情,或者是否必须在应用程序端生成?

5 个答案:

答案 0 :(得分:5)

通过评论,听起来您可以使用IDENTITY字段并将其填充为0并添加前缀/后缀。这样的事情应该有效:

1 - 添加一个IDENTITY字段,该字段将自动递增
2 - 在表格中添加计算字段,其定义为:

[InvoiceNo] AS ('AS' + RIGHT(('000000000' + CAST(idfield AS varchar(9))), 9) + 'FAK')

这将为您提供invoiceno格式:

AS000000001FAK
AS000000002FAK
...
AS000995481FAK

答案 1 :(得分:3)

我从未见过随机生成的发票号码。它们中的大多数通常是多个识别字段的组合。例如,一个段可能是companyID,另一个可能是InvoieID,第三个段可能是Date值

例如,AS-0001-00005-KAS-001-00005-021712-K代表CompanyId 1,发票#5,于2/17/12生成

你在评论中说,你不想让公司知道有多少过去的发票,这样他们就不知道计数,除了他们收到了多少发票,这是他们应该知道的价值。

如果您担心会泄露有多少公司,请使用alpha公司代码,因此最终结果如AS-R07S-00005-KASR07S00005K

答案 2 :(得分:2)

所以你可以这样做,只是不要期望它表现良好。

(1)使用一些详尽的发票值填充一张大型表格 - 这至少应该是您认为您需要的发票数量的两倍。提前以随机顺序填充数据。

(2)创建一个存储过程,将下一张发票从堆中拉出,然后将其删除或将其标记为已采用。

但是,请确保此解决方案对您的业务有意义。在许多国家,发票编号实际上是连续的法律。我猜测我们并不是在谈论发票,而是想确保至少考虑过它。

答案 3 :(得分:0)

随机部分的独特之处是什么让人困惑?如果您有两位数的发票编号,则只能有100个唯一值(00 - 99)。 GUID具有2个功率128值,并且在统计上是唯一的。如果您使用GUID的8个字符,那么即使是100万张发票,您也有可能发生碰撞。如果您使用12个字符的GUID,则有100万张发票,那么您很有可能不会发生碰撞。如果您使用GUID的16个字符,那么如果您的发票少于10亿,那么您在统计上几乎是唯一的。我会使用12个字符,但要检查唯一性的实际值,你只有获得碰撞的彩票机会。

答案 4 :(得分:0)

您如何将这些新发票插入表格?直接批量插入还是先在存储过程中进行一些业务逻辑/完整性检查,然后逐个“创建”发票?

在第二种情况下,您可以在过程中轻松构建唯一ID。您可以将种子编号存储在表中并从中获取数字,然后将其转换为varchar并附加字母数字字符,然后可以增加种子。如果您需要在以后将某些记录导入差距,这还可以选择在唯一ID之间创建间隙。