我需要使用SQL Server 2008自动生成订单确认编号并将其显示在网页上。我设置了一个名为confirmationnumber的列,并为其分配了一个唯一标识符。这是做到这一点的正确方法吗?自动生成确认编号
自动生成确认编号
回答
唯一标识符将生成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。
这真的是一个比技术问题更多的商业问题。但是,当我们在它上面..我认为这个问题的最佳方法是将顺序(缩进)订单号码转换为base36字符串。您最后会看到一个人性化的好订单号码(想想西南航空公司),同时用顺序号码混淆潜在的安全问题。
只是我的两分钱,
这里是base36算法http://en.wikipedia.org/wiki/Base_36
“同时使用连续订购号来混淆潜在的安全问题。”要么存在安全问题,要么没有。 Base36编码根本没有帮助。 – CodesInChaos 2011-05-08 22:57:16
我用的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
散列是安全的和独特的。
问题要求在SQL Server 2008中生成数字的选项。这需要作为服务器上的托管DLL或在应用程序代码中生成来安装和执行。这个数字对于客户通过订单查询向客户服务人员读取仍然是满口的。 – 2011-05-08 23:33:14
他的问题说“与”不在“。”但是,他想要处理数字的生成有点不清楚。这篇文章的任何答案都将根据需求解决问题。 – rboarman 2011-05-09 02:18:59
如果您的项目少于约40亿,这只是平均值。依靠64位散列的唯一性在实践中可能是一个问题。 – CodesInChaos 2011-05-09 09:56:41
您可以使用默认的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])
- 1. 在MySQL中生成自动编号
- 2. 确认UITextview自动完成
- 3. 自动确认
- 4. 读取TCP确认编号
- 5. 生成主键和确认
- 6. 为不同分行生成不同的自动编号
- 7. 如何使用jsp生成自动编号?
- 8. 在SQL Server中生成重复的自动编号
- 9. 在数据库中生成自动唯一编号
- 10. 以自动递增6-8模式生成唯一编号mysql
- 11. CRM中的自动生成编号机会
- 12. 自动生成的每次更新的唯一编号列
- 13. Laravel 5自动生成表格编号/标识符
- 14. CXF不正确的WSDL自动生成?
- 15. 生成编号标记
- 16. Javascript生成分页编号
- 17. 生成唯一编号
- 18. 分页生成编号
- 19. 生成编号顺序
- 20. (Excel)自动编号
- 21. 信号确认
- 22. 自动生成头
- 23. 自动生成PHP
- 24. 自动生成ID
- 25. 生成NSManagedObjectSubclass自动
- 26. 自动生成ID
- 27. 自动生成HTML
- 28. 生成自动ID
- 29. 自动生成WebControls
- 30. 自动生成.net
我永远不会使用身份确认号码,用户可以看到。因为它们是连续的,所以它们可以很容易地被猜测出来,并且存在安全风险。 – rboarman 2011-05-08 22:59:16
好吧,如果您执行一项检查,确认客户与他们正在引用的订单ID相关联,那么您可以消除安全风险。 – 2011-05-08 23:10:32
这只取决于您需要解决方案的安全程度为 – rboarman 2011-05-08 23:11:45