编辑:它将用作员工唯一编号(必须是随机排列的)
我有一张有列的桌子
id(auto-increment), uniqueNumber, and some other field对于每一个插入的记录,我想为uniqueNumber生成一个6位的唯一数字,
现在我用扳机得到了这个
Create TRIGGER [dbo].[trgUniqueCode] ON [dbo].[testtable]
FOR INSERT
AS
declare @id int;
DECLARE @Upper INT
DECLARE @Lower INT
declare @result int
select @id=i.id from inserted i;
SET @Lower = 100000
SET @Upper = (select top 1(isnull(UniqueNumber,999999)) from testtable)
set @result =(ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0))
update testtable set UniqueNumber = @result where ID=@id我不确定这种方法是否有效,我正在寻找一种生成(优先级时间执行)的最佳方法,或者我会在C#中生成唯一的数字?
发布于 2013-03-11 21:56:39
生成一个列表,列出所有尚未分配的号码。对列表进行洗牌,并创建一个包含随机ID和递增索引的新表。当需要新ID时,选择索引最少的ID;从未使用的ID表中删除该ID,并将其作为新ID返回。
发布于 2013-03-11 21:46:32
您可以使用以下方法从SQL Server中精确地获得6位长随机数:
SELECT CAST((RAND() * (899999) + 100000) as int) 我使用以下代码更新表中具有随机生成的数字的字段:
第一部分是一个函数,只要将新行插入到表中,就会调用该函数。
CREATE VIEW ViewRndNum
AS
SELECT CAST((RAND() * (899999) + 100000) as int);
CREATE FUNCTION [dbo].[GetID](@Counter int = 0)
RETURNS int
AS
BEGIN
DECLARE @RandNumber as int;
DECLARE @iEmployeeCode as int;
DECLARE @iExistingEmployeeCode as int;
IF (@Counter < 20)
BEGIN
SELECT @iEmployeeCode = RndNum
FROM ViewRndNum;
SELECT @iExistingEmployeeCode = EmployeeCode FROM dbo.Employees WHERE EmployeeCode = @iEmployeeCode
IF @iExistingEmployeeCode = @iEmployeeCode
BEGIN
SET @Counter = @Counter + 1
SELECT @iEmployeeCode = [dbo].[GetID](@Counter)
END
END
ELSE
SET @iEmployeeCode = 99999999
RETURN @iEmployeeCode
END
GO
CREATE TABLE [dbo].[Employees](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[EmployeeType] [int] NULL,
[EmployeeID] [bigint] NULL,
[EmployeeCode] [int] NULL,
[Employee] [varchar](max) NULL,
[CreatedDate] [datetime] NULL,
[LastSeen] [datetime] NULL,
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Employees] ADD CONSTRAINT [DF_Employees_EmployeeCode] DEFAULT ([dbo].[getID]((0))) FOR [EmployeeCode]
GO发布于 2013-03-11 21:43:09
Transact-SQL:
select floor(rand()*1000000-1)C#:
Random rnd = new Random();
int rslt = rnd.Next(100000, 999999);要生成唯一的值,最好的方法就是只增加一个。另外,生成唯一值的方法在计算效率上越来越低。
另外,您可能希望使用散列函数,它们提供“几乎”唯一的值。但这就是我不太熟悉的地方。
第三个选项是使用GUID作为唯一标识符。它们计算效率很高,即使跨越域边界也保证是唯一的。然而,它们大约有80个符号,而不仅仅是6 :)
https://stackoverflow.com/questions/15349170
复制相似问题