我想通过使用SQL数据库创建优惠券代码生成器,但我不知道如何生成1000随机数而不重复它们。有人帮助我这很重要。谢谢
答案 0 :(得分:0)
下面的代码使用快速方法根据提供的字母生成100个随机5个字符的字符串。你仍然需要执行重复检查,但这应该让你开始。
DECLARE @Quantity INT = 1000
DECLARE @Alphabet VARCHAR(100) = '0123456789'
DECLARE @Length INT = LEN(@Alphabet)
DECLARE @Top INT = SQRT(@Quantity) + 1
;WITH CTE AS (
SELECT TOP (@Top) *
FROM sys.objects
)
SELECT TOP (@Quantity)
SUBSTRING(@Alphabet, ABS(CHECKSUM(NEWID())) % @Length + 1, 1)
+ SUBSTRING(@Alphabet, ABS(CHECKSUM(NEWID())) % @Length + 1, 1)
+ SUBSTRING(@Alphabet, ABS(CHECKSUM(NEWID())) % @Length + 1, 1)
+ SUBSTRING(@Alphabet, ABS(CHECKSUM(NEWID())) % @Length + 1, 1)
+ SUBSTRING(@Alphabet, ABS(CHECKSUM(NEWID())) % @Length + 1, 1)
AS [Code]
FROM CTE X
CROSS JOIN CTE Y
答案 1 :(得分:0)
关系数据库表中的记录本质上是无序的。
因此,您只需创建一个包含index
和@First
之间所有值的表(在您的情况下为0和9999),然后在从该表中进行选择时使用随机顺序。您还可以在数据库表中使用简单的int,并在从表中选择数据时对其进行格式化。
由于我的主数据库是Sql server,而且我没有使用sqlite的经验,我将在我的代码示例中使用Sql Server语法,并留给您查找sqllite等效数据。
首先,创建表格:
@Last
然后,用0到9999之间的数字填充它:
CREATE TABLE Tbl
(
IntValue int PRIMARY KEY,
IsUsed bit NOT NULL DEFAULT 0
)
然后,你想每次都选择多个值,所以我会编写一个这样的存储过程:
;With CTE AS (
SELECT 0 As IntValue
UNION ALL
SELECT IntValue + 1
FROM CTE
WHERE IntValue + 1 < 10000
)
INSERT INTO Tbl (IntValue)
SELECT IntValue
FROM CTE
OPTION(MAXRECURSION 0)
然后,当您想要生成优惠券时,只需使用您想要的优惠券数量执行存储过程:
CREATE PROCEDURE stp_GetCouponCodes
(
@Number int = 5 -- or whatever number is default
)
AS
BEGIN
DECLARE @UsedValues AS TABLE
(
IntValue int
)
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO @UsedValues
SELECT TOP(@Number) IntValue
FROM Tbl
WHERE IsUsed = 0
ORDER BY NEWID()
UPDATE Tbl
SET IsUsed = 1
FROM Tbl
INNER JOIN
@UsedValues uv ON(Tbl.IntValue = uv.IntValue)
SELECT RIGHT('00000' + CAST(IntValue as varchar), 5)
FROM @UsedValues
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
END