0

我有一个客户表,我的要求是添加一个新的 varchar 列,该列在每次创建新客户时自动获取一个随机唯一值。

我想写一个随机化字符串的SP,然后检查并重新生成字符串是否已经存在。但是要将 SP 集成到客户记录创建过程中,需要在代码级别使用事务性 SQL 内容,我想避免这种情况。

请帮忙?

编辑:我应该强调,varchar 必须是 5 个字符长,数值在 1000 到 99999 之间,如果数字小于 10000,则在左侧填充 0。

4

6 回答 6

3

如果它必须是 varchar,您可以将 uniqueidentifier 强制转换为 varchar。

得到一个随机的唯一标识符做NewId()

这是你的投射方式:

CAST(NewId() as varchar(36))

编辑

根据您对@Brannon 的评论:

你是说你永远不会在表中拥有超过 99k 条记录吗?如果是这样,只需将您的 PK 设置为标识列,使用 1000 为其播种,并在您的业务逻辑中处理“0”左填充。

于 2009-04-10T21:33:37.137 回答
1

随机字符串数据是否需要某种格式?如果不是,为什么不使用唯一标识符?

insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())

NEWID()用作列的默认值。

编辑: 我同意@rm,在您的数据库中使用数值,并在代码中处理转换为字符串(使用填充等)。

于 2009-04-10T21:34:19.287 回答
1

当用户不告诉我他们想要做什么,或者为什么,他们只想告诉我怎么做时,这个问题给了我同样的感觉。

“随机”和“唯一”是相互冲突的要求,除非您创建一个序列列表,然后从中随机选择,删除选择的值。

但这要解决的问题是什么?

于 2009-04-10T22:06:20.583 回答
1

通过您的编辑/更新,听起来您需要的是自动增量和一些填充。

下面是一种使用假表的方法,然后添加一个从 1000 开始的 IDENTITY 列(假设您没有),然后使用计算列为您提供一些填充,以使一切按照您的要求进行.

CREATE TABLE Customers (
    CustomerName varchar(20) NOT NULL
)
GO

INSERT INTO Customers 
SELECT 'Bob Thomas' UNION
SELECT 'Dave Winchel' UNION
SELECT 'Nancy Davolio' UNION
SELECT 'Saded Khan'
GO

ALTER TABLE Customers
    ADD CustomerId int IDENTITY(1000,1) NOT NULL
GO 

ALTER TABLE Customers
    ADD SuperId AS right(replicate('0',5)+ CAST(CustomerId as varchar(5)),5) 
GO

SELECT * FROM Customers
GO

DROP TABLE Customers
GO
于 2009-04-10T22:19:18.820 回答
1

我认为迈克尔对自动增量的回答应该很好——你的客户会得到“01000”,然后是“01001”,然后是“01002”等等。

If you want to or have to make it more random, in this case, I'd suggest you create a table that contains all possible values, from "01000" through "99999". When you insert a new customer, use a technique (e.g. randomization) to pick one of the existing rows from that table (your pool of still available customer ID's), and use it, and remove it from the table.

Anything else will become really bad over time. Imagine you've used up 90% or 95% of your available customer ID's - trying to randomly find one of the few remaining possibility could lead to an almost endless retry of "is this one taken? Yes -> try a next one".

Marc

于 2009-04-11T07:19:45.013 回答
0

试试这个:

ALTER TABLE Customer ADD AVarcharColumn varchar(50) 
CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)

它返回一个最多毫秒的日期和时间,这在大多数情况下就足够了。

真的需要一个独特的价值吗?

于 2009-04-10T21:41:00.037 回答