2017-01-17 14 views
0

親テーブルに10Kの名前を挿入しようとしています。しかし、最初の千だけを書く管理。私はあなたの目が私がどこに失敗しているかを見る必要があります。私はそれが増えていないが、なぜ分からないのか理解している。SQL:whileループwhileループ

DECLARE @TempNameTable table (ID int , Name varchar (50)) 
DECLARE @i int = 1, 
    @tempNameValue varchar(50), 
    @randNumber int = 1 

INSERT INTO @TempNameTable VALUES 
    (1,'Jonas'), (2,'Petras'),(3,'Antanas') 
    , (4,'Stasys'), (5,'Dainius'), (6,'Giedrius') 
    , (7,'Mindaugas'), (8,'Povilas'), (9,'Kestutis') 
    , (10,'Darius') 


WHILE ((SELECT COUNT(Name) FROM Parent) < 10000) 
BEGIN 
WHILE @i < 11 
    BEGIN 
     SET @tempNameValue = CASE 
      WHEN @i = 1 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 2 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 3 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 4 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 5 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 6 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      WHEN @i = 7 THEN 
       (SELECT Name from @TempNameTable WHERE ID = @i) 
      END 
     WHILE @randNumber < 1000 
     BEGIN 
      INSERT INTO Parent VALUES 
      (@tempNameValue + CAST(@randNumber as varchar(1000))) 
      SET @randNumber = @randNumber + 1 
     END 
    SET @i = @i + 1 
    END 

END 
+3

クエリが同じ場合はなぜCASEを使用しますか?あなたの@i変数は、異なる条件を保証します –

+0

使用しているdbmsにタグを付けます(おそらくSQL Server?)そのコードはANSI SQL準拠とはまったく異なります。 – jarlh

+0

私はSQLサーバーを使用しています。 – LTnewbie

答えて

3

私はあなたのクエリがなったとします。ループのない

DECLARE @TempNameTable table (ID int , Name varchar (50)) 
DECLARE @tempNameValue varchar(50), 
@randNumber int = 1 

INSERT INTO @TempNameTable VALUES 
(1,'Jonas'), (2,'Petras'), (3,'Antanas'), 
(4,'Stasys'), (5,'Dainius'), (6,'Giedrius'), 
(7,'Mindaugas'), (8,'Povilas'), (9,'Kestutis'), (10,'Darius') 

WHILE ((SELECT COUNT(Name) FROM Parent) < 10000) 
BEGIN 
    SET @randNumber = 1 
    WHILE @randNumber <= 1000 
    BEGIN 
     INSERT INTO Parent 
     SELECT Name + CAST(@randNumber as varchar(1000)) 
     FROM @TempNameTable 
     SET @randNumber = @randNumber + 1 
    END 
END 
+0

しかし、それでも私は必要な10kではない1000のエントリしか書いていません。しかしこれはCASEよりもずっと簡単です。愚かな私:/ – LTnewbie

+0

私は修正しようとし、私は私の答えを更新します –

+0

内部ループの前に '@ randnumber'をリセットしてはいけませんか? –

0
I'd do it like the below. Just tested and it outputs each name * 1,000 rows. It's more verbose but its obvious what it's doing and it works. 

Declare @Jonas varchar(20) = 'Jonas' 
Declare @Petras varchar(20) = 'Petras' 
Declare @Antanas varchar(20) = 'Antanas' 
Declare @Stasys varchar(20) = 'Stasys' 
Declare @Dainius varchar(20) = 'Dainius' 
Declare @Giedrius varchar(20) = 'Giedrius' 
Declare @Mindaugas varchar(20) = 'Mindaugas' 
Declare @Povilas varchar(20) = 'Povilas' 
Declare @Kestutis varchar(20) = 'Kestutis' 
Declare @Darius varchar(20) = 'Darius' 

Declare @TempJonas varchar(20) 
Declare @TempPetras varchar(20) 
Declare @TempAntanas varchar(20) 
Declare @TempStasys varchar(20) 
Declare @TempDainius varchar(20) 
Declare @TempGiedrius varchar(20) 
Declare @TempMindaugas varchar(20) 
Declare @TempPovilas varchar(20) 
Declare @TempKestutis varchar(20) 
Declare @TempDarius varchar(20) 

Declare @NameIncrement int = 0 

WHILE @NameIncrement <= 1000 
BEGIN 
    Set @TempJonas = @Jonas + CONVERT(varchar(6),@NameIncrement) 
    Set @TempPetras = @Petras + CONVERT(varchar(6),@NameIncrement) 
    Set @TempAntanas = @Antanas + CONVERT(varchar(6),@NameIncrement) 
    Set @TempStasys = @Stasys + CONVERT(varchar(6),@NameIncrement) 
    Set @TempDainius = @Dainius + CONVERT(varchar(6),@NameIncrement) 
    Set @TempGiedrius = @Giedrius + CONVERT(varchar(6),@NameIncrement) 
    Set @TempMindaugas = @Mindaugas + CONVERT(varchar(6),@NameIncrement) 
    Set @TempPovilas = @Povilas + CONVERT(varchar(6),@NameIncrement) 
    Set @TempKestutis = @Kestutis + CONVERT(varchar(6),@NameIncrement) 
    Set @TempDarius = @Darius + CONVERT(varchar(6),@NameIncrement) 

    Insert Into Parent 
    Select @TempJonas 

    Insert Into Parent 
    Select @TempPetras 

    Insert Into Parent 
    Select @TempAntanas 

    Insert Into Parent 
    Select @TempStasys 

    Insert Into Parent 
    Select @TempDainius 

    Insert Into Parent 
    Select @TempGiedrius 

    Insert Into Parent 
    Select @TempMindaugas 

    Insert Into Parent 
    Select @TempPovilas 

    Insert Into Parent 
    Select @TempKestutis 

    Insert Into Parent 
    Select @TempDainius 

    Set @NameIncrement = @NameIncrement + 1  
END 
0

セット・ベースの答え:

rextester:http://rextester.com/EBM78452

declare @TempNameTable table (id int , Name varchar (50)) 
insert into @TempNameTable values 
    (1,'Jonas'), (2,'Petras'), (3,'Antanas') 
    , (4,'Stasys'), (5,'Dainius'), (6,'Giedrius') 
    , (7,'Mindaugas'), (8,'Povilas'), (9,'Kestutis') 
    , (10,'Darius'); 

if object_id('tempdb..#r') is not null drop table #r; 
create table #r (n int not null primary key, r int not null); 

with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, d as (
    select n=row_number() over (order by (select 1)) 
     , r=convert(int,((rand(checksum(newid())) * 10)+1)) 
    from   n as deka 
     cross join n as hecto 
     cross join n as kilo 
     cross join n as tenK 
    ) 
insert into #r (n, r) 
select n, r from d; 
--insert into Parent 
select Name=Name+convert(varchar(13),n) 
    from #r as r 
    inner join @TempNameTable t on r.r=t.id 

これはconvert(int,((rand(checksum(newid())) * 10)+1))にを使用しています1から10までの乱数を生成し、それを使ってテンポラリテーブルに結合します。#rから@TempNameTable