2012-02-17 28 views
0

我正在尋找一種方式,SQL Server可以生成一個不是增量Int或GUID的唯一標識符。創建非內聯和非Guid唯一標識符

唯一ID可以是字母和數字的組合,並且沒有其他字符,正如前面提到的必須是唯一的。

AS93K239DFAK

如果可能的話必須始終AS開始或與K

結束這將是很好,如果能自動當有Insert喜歡的GUID和IsIdentity生成這個唯一的ID =是確實。它可以是一個隨機數,它不是在應用程序中預先確定的。

正在做這樣的事情嗎?還是必須生成應用程序端?

+0

猜測能力是一個問題嗎?即編碼增量整數是否可接受? – 2012-02-17 16:33:35

+0

我正在尋找一種方式,SQL Server可以生成一個不是增量Int或GUID的唯一標識符。 – 2012-02-17 16:34:45

+5

一般來說,這是一個**糟糕的主意**。內置的獨特id總是更好用 - 在處理SQL Server爲您處理的爭用問題上存在非常棘手的問題,而且很難推出自己的解決方案,運行良好。 – JNK 2012-02-17 16:39:02

回答

5

從評論,這聽起來像你可以使用IDENTITY領域和填充0和添加前綴/後綴。像這樣的東西應該工作:

- 添加IDENTITY場,這將是自動遞增
- 在表中添加計算字段的定義:

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

這會給你invoiceno的格式:

AS000000001FAK 
AS000000002FAK 
... 
AS000995481FAK 
+0

+1,但我猶豫了 - 不要用別名的單引號!此外爲什麼沒有長度定義的varchar? :-) – 2012-02-17 16:57:08

+0

有沒有辦法讓它變得隨機,還是它必須增加? – 2012-02-17 16:57:26

+0

沒有簡單的隨機方法。我猜你可以用'NEWID()'來做一些類似的事情。 – JNK 2012-02-17 16:58:02

2

所以你可以這樣做,只是不要指望它表現良好。

(1)使用一些詳盡的發票值填充一張大型表格 - 這應該至少是您需要的認爲的發票數量的兩倍。提前以隨機順序填充數據。 (2)創建一個存儲過程,將下一張發票從堆中取出,然後刪除它或將其標記爲已採用。

但是,請確保此解決方案對您的業務有意義。在許多國家,發票號碼實際上是順序的。我猜我們並不是在談論發票,而是想確保它至少被考慮在內。

+0

這似乎很混亂,我想使用GUID的部分可以工作,但獨特的部分是混亂。 – 2012-02-17 17:21:04

+0

如果預先填充表格,則可以刪除重複項。您只填充表格一次 - 您的異議似乎與不需要數字表格的人員相似,因爲他們認爲在模式中添加多個表格效率低下。 – 2012-02-17 17:21:48

+0

這也是一個維護問題,我沒有看到真正的可擴展性。 – 2012-02-17 17:23:22

3

我從來沒有見過一個隨機生成的發票號碼。他們中的大多數通常是多個識別字段的組合。例如,一個段可能是companyID,另一個可能是InvoieID和第三可能是一個日期值

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

你在評論中說,你不想讓公司知道有多少過去的發票存在,這樣他們就不會知道計數,除了他們有多少發票收到,這是他們應該知道的價值。

如果你關心放棄多少企業有,使用Alpha公司代碼代替,所以你最終的結果看起來像AS-R07S-00005-KASR07S00005K

0

什麼是如此混亂關於隨機部分是獨一無二的?如果您有兩位數的發票號碼,則只能有100個唯一值(00 - 99)。一個GUID具有2個128的冪值,並且在統計上是唯一的。如果您使用8個GUID字符,那麼即使有100萬張發票,您也有可能發生碰撞。如果您使用12個GUID字符,那麼您有100萬張發票,那麼您很有可能不會發生碰撞。如果您使用GUID的16個字符,那麼如果您的發票少於10億,那麼您在統計學上就非常獨特。我會使用12個字符,但檢查實際值的唯一性,你只有抽籤機會碰撞。

0

如何將這些新發票插入表中?一個直接的批量插入,或者你是否首先在存儲過程中進行一些業務邏輯/完整性檢查,然後逐個創建發票?

在第二種情況下,你可以很容易地建立在程序的唯一ID。您可以將種子編號存儲在表中,然後從中取出編號,然後將其轉換爲varchar並附加字母數字字符,然後可以遞增種子。如果您需要稍後將某些記錄導入間隙,則還可以選擇在唯一ID之間創建間隔。

相關問題