2017-01-17 2 views
0

Ich versuche, 10K Namen in Parent-Tabelle einfügen, mit 10 beschriebenen Namen beim Hinzufügen von Nummer auf der Rückseite. Aber man schafft es, nur die ersten Tausend zu schreiben. Ich brauche deine Augen, um zu sehen, wo ich versage. Ich verstehe, dass @i nicht zunimmt, aber weiß nicht warum.SQL: While-Schleife in While-Schleife

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

beizutreten Warum eine CASE verwenden, wenn Ihre Abfrage die gleiche ist? Ihre @ i Variable garantiert eine andere, wo Bedingung –

+0

Markieren Sie die DBMS Sie verwenden (vielleicht SQL Server?) Dieser Code ist weit von ANSI SQL-konform. – jarlh

+0

Ich benutze SQL Server. – LTnewbie

Antwort

3

Ich nehme Ihre Anfrage wird:

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

Aber es schreibt immer noch nur 1000 Einträge, nicht 10k, die ich brauche. Aber das ist viel einfacher als mit CASE. töricht mich:/ – LTnewbie

+0

Ich versuche zu beheben und ich werde meine Antwort aktualisieren –

+0

Sollten Sie nicht vor der inneren Schleife '@ randnumber' zurücksetzen? –

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

Set basiert Antwort ohne Schleifen:

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 

Dies verwendet convert(int,((rand(checksum(newid())) * 10)+1)) zu generieren Sie eine Zufallszahl von 1 bis 10, und verwendet, um die temporäre Tabelle #r zu @TempNameTable