2011-05-08 88 views
2

我需要使用SQL Server 2008自動生成訂單確認編號並將其顯示在網頁上。我設置了一個名爲confirmationnumber的列,併爲其分配了一個唯一標識符。這是做到這一點的正確方法嗎?自動生成確認編號

回答

1

唯一標識符將生成GUID。這些字符長度爲32個字符,並不友好(想想客戶用他的參考號碼撥打電話的場景)。一個GUID如下所示:

f56c41dd-7811-461a-9378-e3a2b095aafc

我想看看使用帶屬性集合一個int,這將至少是一個易於使用的數字。

CREATE TABLE order (order_id int not null IDENTITY(1,1), customer_code varchar(50) NOT NULL); 

然後插入的順序爲:然後

DECLARE @order_id int; 
INSERT INTO order(customer_code) VALUES('dotnethacker') 
SET @order_id = SCOPE_IDENTITY() 

@order_id將包含新插入的ID。

+0

我永遠不會使用身份確認號碼,用戶可以看到。因爲它們是連續的,所以它們可以很容易地被猜測出來,並且存在安全風險。 – rboarman 2011-05-08 22:59:16

+1

好吧,如果您執行一項檢查,確認客戶與他們正在引用的訂單ID相關聯,那麼您可以消除安全風險。 – 2011-05-08 23:10:32

+1

這隻取決於您需要解決方案的安全程度爲 – rboarman 2011-05-08 23:11:45

2

這真的是一個比技術問題更多的商業問題。但是,當我們在它上面..我認爲這個問題的最佳方法是將順序(縮進)訂單號碼轉換爲base36字符串。您最後會看到一個人性化的好訂單號碼(想想西南航空公司),同時用順序號碼混淆潛在的安全問題。

只是我的兩分錢,

這裏是base36算法http://en.wikipedia.org/wiki/Base_36

+2

「同時使用連續訂購號來混淆潛在的安全問題。」要麼存在安全問題,要麼沒有。 Base36編碼根本沒有幫助。 – CodesInChaos 2011-05-08 22:57:16

5

我用的GUID用於此目的的鏈接。不過,我喜歡有一個更簡單的版本,在眼睛上更容易一些。這裏是會出現亂碼的GUID的函數:

public static string GenerateKey() 
    { 
     long i = 1; 
     foreach (byte b in Guid.NewGuid().ToByteArray()) 
     { 
      i *= ((int)b + 1); 
     } 
     return string.Format("{0:x}", i - DateTime.Now.Ticks); 
    } 

結果看起來是這樣的:

38f50037b1b56c97

散列是安全的和獨特的。

+0

問題要求在SQL Server 2008中生成數字的選項。這需要作爲服務器上的託管DLL或在應用程序代碼中生成來安裝和執行。這個數字對於客戶通過訂單查詢向客戶服務人員讀取仍然是滿口的。 – 2011-05-08 23:33:14

+0

他的問題說「與」不在「。」但是,他想要處理數字的生成有點不清楚。這篇文章的任何答案都將根據需求解決問題。 – rboarman 2011-05-09 02:18:59

+0

如果您的項目少於約40億,這只是平均值。依靠64位散列的唯一性在實踐中可能是一個問題。 – CodesInChaos 2011-05-09 09:56:41

0

您可以使用默認的NEWID()創建uniqueidentifier類型的列。

CREATE TABLE [dbo].[TestTable](
    [id] [uniqueidentifier] NOT NULL 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_id] DEFAULT (NEWID()) FOR [id] 

爲了趕上新插入的GUID,您可以使用OUTPUT子句:

INSERT INTO TestTable (id) 
OUTPUT inserted.id 
VALUES(DEFAULT) 

UPDATE: 要生成的10位數字和字母的代碼是沒有問題的。保證唯一性的問題。要做到這一點,你應該檢查你的表,如果這個代碼是真正獨特的。

; with numbers as 
     (SELECT ROW_NUMBER() OVER(ORDER BY o1.object_id,o2.object_id) Num, 
      LEFT(REPLACE(CAST(NEWID() as nvarchar(40)),'-',''),10) Code 
FROM sys.objects o1, sys.objects o2) 
    SELECT TOP 1 Code FROM numbers where NOT EXISTS(SELECT code FROM [Table]) 
+0

這使我得到了GUID,但是如何使一個更短,如果可能的話10個數字的確認號碼。還需要在前端顯示它,不太清楚如何做到這一點。 – multiv123 2011-05-11 23:40:56

+0

大概6個字母的字母數字將是理想的 – multiv123 2011-05-12 00:53:03