---
title: "Formel för att snabbt lägga till data i db"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/191916-formel-för-att-snabbt-lägga-till-data-i-db"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "bigsky"
published: "2013-12-26T20:18:21.000Z"
updated: "2014-01-02T16:21:22.000Z"
replies: 10
views: 1886
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/191916-formel-för-att-snabbt-lägga-till-data-i-db"
---

# Formel för att snabbt lägga till data i db

## #1 — bigsky, 2013-12-26T20:18Z

Jag har en tabell med två fält, Id och Field. Jag skulle vilja ha en sql fråga för att fylla på med lite data enligt följande.

Id  Field
1  1
1  2
1  3
1 ...
1 57
2  1
2  2
2  3
2  ...
2  57
Osv.

Dvs för alla i Id ska det fyllas på upp till talet 57 i Field. Om det är viktig info så kan jag också säga att jag kommer att ha upp till 96 i kolumnen Id.

Hur ska denna sql fråga se ut?

Permalänk: https://www.webforum.nu/p/191916

## #2 — aasah, 2013-12-27T09:38Z

Hm... Har du värdet på Id-fältet lagrat någon annanstans?

Kan man alltså hämta värdet på Id från någon annan tabell?

Finns kanske även Field-värdena i en annan tabell?

Vad har du för databas? SQL Server, MySQL, ...?

Om det går att hämta värdena från någon annan tabell blir det enklare, annars kan du tex göra så här:

```
 -- MS SQL Server 2005 och uppåt
DECLARE @i int = 1

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
)

WHILE @i < 97
BEGIN

  INSERT INTO #Dummy (Tal, IsField) 
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END

  SET @i = @i + 1

END

-- Nu innehåller #Dummy talen 1-96, de första 57 har IsField = 1, resten 0

-- Dags för den INSERT du letar efter

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal

-- ORDER BY om ordningen är viktig

-- Rensa
DROP TABLE #Dummy
```

Permalänk: https://www.webforum.nu/p/2314971

## #3 — bigsky, 2013-12-27T18:38Z

Kör med mysql.

Permalänk: https://www.webforum.nu/p/2314974

## #4 — bigsky, 2013-12-28T21:21Z

Som sagt, kör med myQSL, har du någon lösning på den varianten?

Permalänk: https://www.webforum.nu/p/2314991

## #5 — nitro2k01, 2013-12-29T06:59Z

Ursäkta snorkigheten, men vad försöker du åstadkomma *egentligen?* Risken finns att det finns ett bättre sätt att göra det du vill som inte bygger på att ha tabeller med nummerserier.

Permalänk: https://www.webforum.nu/p/2314998

## #6 — bigsky, 2013-12-29T09:37Z

Ingen fara. Jag har sedan tidigare här på wF redan blivit rekommenderad att göra på detta sätt. Har du någon lösning enligt ovan fast för mySQL?

Jag vill bara snabbt få in dessa rader i databasen istället för att skriva in dem manuellt.

Permalänk: https://www.webforum.nu/p/2315000

## #7 — aasah, 2013-12-29T18:26Z

Har du prövat om lösningen ovan funkar för MySQL?

Permalänk: https://www.webforum.nu/p/2315002

## #8 — bigsky, 2013-12-29T18:48Z

Nej, antog kanske dumt nog att den inte skulle fungera. Ska testa och återkommer.

Permalänk: https://www.webforum.nu/p/2315003

## #9 — bigsky, 2013-12-30T15:23Z

```php
<?php
$con = mysqli_connect("","","","");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="
DECLARE @i int = 1

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
)

WHILE @i < 97 DO
BEGIN

  INSERT INTO #Dummy (Tal, IsField)
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
  SET @i = @i + 1

END

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal

DROP TABLE #Dummy
";

if (mysqli_query($con,$sql))
  {
  echo "Success!";
  }
else
  {
  echo "Error: " . mysqli_error($con);
  }
?>
```

Får felmeddelandet (Har naturligtvis en korrekt databaskoppling annars):

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @i int = 1; CREATE TABLE #Dummy( Tal int, IsField bit ) WHILE @i \<' at line 1

Permalänk: https://www.webforum.nu/p/2315005

## #10 — bigsky, 2014-01-01T11:48Z

Ingen???

Permalänk: https://www.webforum.nu/p/2315023

## #11 — aasah, 2014-01-02T16:21Z

> **[bigsky skrev:](https://www.webforum.nu/p/1569783)**
>
> ```php
> <?php
> $con = mysqli_connect("","","","");
>
> if (mysqli_connect_errno())
>   {
>   echo "Failed to connect to MySQL: " . mysqli_connect_error();
>   }
>
> $sql="
> DECLARE @i int = 1
>
> CREATE TABLE #Dummy(
>   Tal int,
>   IsField bit
> )
>
> WHILE @i < 97 DO
> BEGIN
>
>   INSERT INTO #Dummy (Tal, IsField)
>   SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
>   SET @i = @i + 1
>
> END
>
> INSERT INTO YourTable(Id, Field)
> SELECT
>   I.Tal,
>   F.Tal
> FROM
>   #Dummy I
>   CROSS JOIN (
>     SELECT Tal FROM #Dummy D WHERE IsField = 1
>   ) AS F
> ORDER BY 
>   I.Tal,
>   F.Tal
>
> DROP TABLE #Dummy
> ";
>
> if (mysqli_query($con,$sql))
>   {
>   echo "Success!";
>   }
> else
>   {
>   echo "Error: " . mysqli_error($con);
>   }
> ?>
> ```
>
>
>
> Får felmeddelandet (Har naturligtvis en korrekt databaskoppling annars):
>
> Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @i int = 1; CREATE TABLE #Dummy( Tal int, IsField bit ) WHILE @i \<' at line 1

Det är många år sedan jag senaste programmerade mot MySQL och när du kör hela uttrycket på en gång kan det vara svårt att gissa vad som egentligen inte fungerar.

Några saker du kan prova:

1) Ändra variabelhanteringen ([WHILE i MySQL](http://dev.mysql.com/doc/refman/5.0/en/while.html), [Variabler i MySQL](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html))
2) Stoppa in ';' på alla ställen där ett visst uttryck tar slut. Förhopningsvis får du tydligare felmeddelanden då.
3) Kör delar av lösningen i taget för att se var det egentligen kraschar.

Pröva t.ex.: (Se länkar ovan) 

```

DECLARE i int DEFAULT 1;

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

WHILE i < 97 DO

  INSERT INTO #Dummy (Tal, IsField)
  SELECT i, CASE WHEN i < 58 THEN 1 ELSE 0 END
  SET i = i + 1

END WHILE;

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal
;

DROP TABLE #Dummy;
```

eller (Se länkar ovan)

```

SET @i = 1;

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

WHILE @i < 97 DO

  INSERT INTO #Dummy (Tal, IsField)
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
  SET @i = @i + 1

END WHILE;

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal
;

DROP TABLE #Dummy;
```

eller  (vanligt sunt förnuft ;) )

försök att köra bit för bit:

1)

```

DECLARE i int DEFAULT 1;

SELECT 'Gick'
```

Om det funkar så funkar variabeltilldelningen.

2) 

```

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

SELECT * FROM #Dummy;  //Så klart tom

DROP TABLE #Dummy;
```

Funkar hanteringen av temptabeller?

3)

```

DECLARE i int DEFAULT 1;

WHILE i < 10 DO

  SELECT i, CASE WHEN i < 58 THEN 1 ELSE 0 END
  SET i = i + 1

END WHILE;
```

Funkar while-slingan?

Då bör du, om inte förr, hitta var felet faktiskt är. Då kan man leta efter lösningar därifrån.

Permalänk: https://www.webforum.nu/p/2315058

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/191916-formel-för-att-snabbt-lägga-till-data-i-db
