【问题标题】:inner while with random values带有随机值的内部 while
【发布时间】:2016-11-20 19:53:02
【问题描述】:

我想创建 100 个随机卡号。我对这 100 行有一段时间,对随机数有一段内部时间。 使用此代码,我可以创建随机数,但 100 行始终具有相同的数字,我希望每一行都有一个新数字。

Create Table #Nr_Cartao
(valor varchar(20) not null) 

declare @NrCartao varchar(20);
declare @NrCartao16Digitos varchar(20);
declare @counter int;
declare @random int;
declare @Nr_iterações int;
declare @digitos int;

set @Nr_iterações = 100;
set @NrCartao9Digitos = '';
set @NrCartao = '';
set @counter = 0;
set @digitos = 1

While @counter < @Nr_iterações
begin

While @digitos <= 16
Begin

set @random = rand()*10
set @NrCartao = @NrCartao + '' + CONVERT(varchar(20), @random)

if (@digitos % 4) = 0 and @digitos < 16
set @NrCartao = @NrCartao + '-'

set @digitos= @digitos +1

end;

set @NrCartao16Digitos = @NrCartao;
set @counter = @counter + 1;

insert into #Nr_Cartao values( @NrCartao16Digitos);

end

select *
from #Nr_Cartao
go;

你能帮忙吗?

【问题讨论】:

    标签: sql-server tsql random while-loop


    【解决方案1】:

    如果您仍打算继续查询,只需重置 @digitos@NrCartao 的值

        INSERT INTO #Nr_Cartao
        VALUES (@NrCartao16Digitos); 
        SET @digitos = 1 -- reset to 1
        SET @NrCartao = '' -- to empty
    

    【讨论】:

      【解决方案2】:

      您的代码看起来非常程序化,但是对于T-SQL,人们应该更喜欢基于集合的 方法。

      我不完全理解您试图达到的目标,但以下几行将以随机排序顺序为您提供从 1 到 100 的数字:

      WITH row100 AS
      (
          SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS SortId
          FROM sys.objects AS o --Should contain at least 100 rows...
      )
      SELECT * 
      FROM row100
      ORDER BY NEWID()
      

      CTE row100 带回 100 个运行数字。如果没有 CTE,您也将获得 100 行,但运行数字不会停留在 1 到 100 的范围内。最终的 SELECT 执行 ORDER BY NEWID(),这是一个 准随机 结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多