2011-05-08 111 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