2017-01-17 6 views
0

Я пытаюсь вставить имена 10K в родительскую таблицу, используя 10 описаных имен при добавлении числа в спину. Но умею писать только первую тысячу. Мне нужны ваши глаза, чтобы увидеть, где я терплю неудачу. Я понимаю, что @i не увеличивается, но не знаю почему.SQL: while loop in While Loop

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

Но он все еще пишет только 1000 записей, а не 10k, которые мне нужны. Но это гораздо проще, чем с CASE. doolish me:/ – 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 и использовать это для присоединения к таблице temp #r к @TempNameTable