想要生成5位数的优惠券代码

时间:2015-06-15 10:27:16

标签: sql-server sqlite

我想通过使用SQL数据库创建优惠券代码生成器,但我不知道如何生成1000随机数而不重复它们。有人帮助我这很重要。谢谢

2 个答案:

答案 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语法,并留给您查找sql​​lite等效数据。

首先,创建表格:

@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

See working fiddle example here.