自动生成确认号码

时间:2011-05-08 22:46:20

标签: c# asp.net sql-server

我需要使用SQL Server 2008自动生成订单确认编号并将其显示在网页上。我已经设置了一个名为confirmationnumber的列,并为其分配了一个uniqueidentifier。这是正确的方法吗?

4 个答案:

答案 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])