我需要使用SQL Server 2008自动生成订单确认编号并将其显示在网页上。我已经设置了一个名为confirmationnumber的列,并为其分配了一个uniqueidentifier。这是正确的方法吗?
答案 0 :(得分:5)
我为此目的使用guids。但是,我喜欢有一个更简单的版本,在眼睛上更容易。这是一个散列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
哈希是安全且独特的。
答案 1 :(得分:2)
这确实是一个商业问题,而不是技术问题。但是当我们在它上面时......我认为解决这个问题的最佳方法是将顺序(缩进)订单号转换为base36字符串。您最终会得到一个很好的订单号,这个订单号对人类友好(想想西南航空公司),同时也会使用连续的订单号混淆潜在的安全问题。
只是我的两分钱,
这是指向base36算法http://en.wikipedia.org/wiki/Base_36
的链接答案 2 :(得分:1)
uniqueidentifier将生成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。
答案 3 :(得分: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)
<强>更新强> 生成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])