Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建非Int和非Guid唯一标识符_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

Sql server 创建非Int和非Guid唯一标识符,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我正在寻找一种SQL Server生成唯一标识符的方法,该标识符不是增量Int或GUID 唯一ID可以是字母和数字的组合,并且没有其他字符,如前所述,必须是唯一的 ieAS93K239DFAK 如果可能,必须始终以AS开头或以K结尾 如果在有像guid和IsIdentity=Yes这样的Insert时可以自动生成此唯一id,那就太好了。它可以是一个随机数,在应用程序中不是预先确定的 这样做是可能的,还是必须在应用程序端生成?从评论中可以看出,您可以使用标识字段,并用0填充它并添加前缀/后缀。像这

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

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

ie
AS93K239DFAK

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

如果在有像guid和IsIdentity=Yes这样的
Insert
时可以自动生成此唯一id,那就太好了。它可以是一个随机数,在应用程序中不是预先确定的


这样做是可能的,还是必须在应用程序端生成?

从评论中可以看出,您可以使用
标识
字段,并用0填充它并添加前缀/后缀。像这样的方法应该会奏效:

1-添加一个将自动递增的
IDENTITY
字段
2在表中添加一个计算字段,定义如下:

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

这将为您提供以下格式的
invoiceno

AS000000001FAK
AS000000002FAK
...
AS000995481FAK

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

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

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


但是,请确保此解决方案对您的业务有意义。在许多国家,发票号码按顺序排列实际上是法律规定的。我猜我们不是真的在谈论发票,而是想确保它至少得到了考虑。

我从未见过随机生成的发票编号。其中大多数通常是多个标识字段的组合。例如,一个段可能是companyID,另一个段可能是InvoieID,第三个段可能是日期值

例如,
AS-0001-00005-K
AS-001-00005-021712-K
,代表2012年2月17日生成的公司ID 1发票#5

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


如果您担心泄露公司数量,请改用阿尔法公司代码,这样您的最终结果看起来像是
AS-R07S-00005-K
ASR07S00005K

为什么随机部分是唯一的?如果您有两位数的发票号码,则只能有100个唯一值(00-99)。GUID具有2到128次方的值,并且在统计上是唯一的。如果使用8个字符的GUID,那么即使有100万张发票,也有可能发生冲突。对于100万张发票,如果使用12个字符的GUID,则很有可能不会发生冲突。如果您使用16个字符的GUID,那么如果您的发票少于10亿张,那么您在统计上几乎是唯一的。我会使用12个字符,但要与实际值进行唯一性检查,您只会有可能发生冲突。

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


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

一般来说,这是一个糟糕的主意。内置的唯一ID总是更易于使用-在处理SQL Server用这些ID为您处理的争用方面存在着非常棘手的问题,要推出自己的解决方案并使其运行良好非常困难。我将与@JNK同舟共济。也许你可以解释一下你想这样做的原因?这感觉就像是你在重新发明轮子。这里的用例/理由是什么?我也不知道为什么这会获得否决票。这是一个常见的问题。在插入时,您获取标识值并在前面添加“AS”,在后面添加“K”。否则你就是在刺伤自己的眼睛。和一只地鼠在一起。+1,但我犹豫了——不要用单引号来表示别名!为什么varchar上没有长度定义?:-)有没有一种方法可以使它随机,或者它必须增加?没有简单的随机方法。我想你可以用
NEWID()
做一些类似的事情。@ZeeTee
guid
总是唯一的。它们是全局唯一的,因为在每个sql server中都会生成其他任何服务器都无法生成的新sql server。冲突是可能的,但可能性极低。@JNK我不想将
123123-123123-123123-123123-123123
作为发票号,哈哈,太长了……看起来很混乱,我想使用GUID片段可能会起作用,但唯一的部分很混乱。如果您提前填充表,可以删除重复的部分。你只需要填充一次表-你的反对意见似乎与那些不想要数字表的人相似,因为他们认为在他们的模式中再添加一个表是低效的。这也是一个维护问题,我不认为这是真正的可伸缩性。好的,我正在编写一个代码示例,向你展示这是多么简单,但是既然你已经决定不值得你花时间,我就去吃午饭。如果您已经知道哪些解决方案是好的,哪些是b