---
title: "Göre INSERT i en loop"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/168133-göre-insert-i-en-loop"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "devotion"
published: "2008-01-15T16:24:36.000Z"
updated: "2008-01-24T21:02:45.000Z"
replies: 19
views: 923
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/asp/168133-göre-insert-i-en-loop"
---

# Göre INSERT i en loop

## #1 — devotion, 2008-01-15T16:24Z

Hej!

Jag har följande kod, där jag vill göra en insert till en annan tabell. Men hur gör jag det för att undvika att ha ett databasanrop i loopen? :)  

```
'SQL-fråga
	sSQL = "SELECT * FROM [tblTask] WHERE [PlanStartDate] >= '" & tmStartDate & "' AND [PlanStartDate] < '" & tmStopDate & "'"
	Rs.Open sSQL, Conn
	
	while not rs.EOF
	            'INSERT till tblContractTemplate
		rs.MoveNext
	wend
```

Mvh
Henrik

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

## #2 — Travoni, 2008-01-15T16:36Z

Måste du köra en loop då?

Funkar inte detta:

```
sSQL = "INSERT INTO ANNAN_TABELL (id, annat1, annat2) SELECT id, annat1, annat2 FROM [tblTask] WHERE [PlanStartDate] >= '" & tmStartDate & "' AND [PlanStartDate] < '" & tmStopDate & "'"
conn.execute(sSQL),,128
```

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

## #3 — devotion, 2008-01-15T17:48Z

Hej!
Ja, jag måste göra en loop... :)   

mvh
Henrik

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

## #4 — @nders, 2008-01-15T17:59Z

Beror på vilken dbms man använder.

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

## #5 — devotion, 2008-01-15T18:01Z

> **@nders skrev:**
>
> Beror på vilken dbms man använder.

 :(  

MS SQL....

 :)  

Mvh
Henrik

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

## #6 — @nders, 2008-01-15T18:05Z

Då kan man konkatenera ihop flera frågor och köra i en fet batch.

```
strsql = "insert into blah..." & vbcrlf & _
         "insert into blah..." & vbcrlf & _
         "insert into blah..."
oconn.execute strsql,,128
```

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

## #7 — Peter S, 2008-01-15T18:13Z

```
'SQL-fråga
	sSQL = "SELECT * FROM [tblTask] WHERE [PlanStartDate] >= '" & tmStartDate & "' AND [PlanStartDate] < '" & tmStopDate & "'"
	Rs.Open sSQL, Conn
	limit = 1000
	counter = 0
	set rs2 = server.createobject("adodb.recordset")
	rs2.cursorlocation = adOpenKeyset
	rs2.locktype = adLockBatchOptimistic
	rs2.open "select * from tblContractTemplate where 1 = 0", conn
	while not rs.EOF
	            'INSERT till tblContractTemplate
		rs2.addnew
		rs2.fields("field1") = rs("field1")
		rs2.fields("field2") = rs("field2")
		rs2.fields("fieldn") = rs("fieldn")
		counter = counter + 1
		if counter mod limit = 0 then
			rs2.updatebatch
		end if
		rs.MoveNext
	wend
	if counter mod limit <> 0 then
		rs2.updatebatch
	end if
	rs2.close
```

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

## #8 — @nders, 2008-01-15T18:40Z

Då jag har hört illasinnade rykten om att mitt inlägg inte förstås kommer här en förenkling.

```
	while not rs.EOF
	        strsql = strsql & "INSERT till tblContractTemplate ......" & vbcrlf
		rs.MoveNext
	wend
	....
	Conn.execute strsql,,128
```

mvh

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

## #9 — CatZ, 2008-01-15T18:55Z

Mmm det är lite svårt att förstå marsvins @nders ibland :p

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

## #10 — devotion, 2008-01-15T18:56Z

> **CatZ skrev:**
>
> Mmm det är lite svårt att förstå marsvins @nders ibland :p

  :moose

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

## #11 — emission, 2008-01-15T20:59Z

> **devotion skrev:**
>
> Hej!
> Ja, jag måste göra en loop... :)

Därför att?

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

## #12 — devotion, 2008-01-15T21:20Z

> **emission skrev:**
>
> Därför att?

Hmmm... Ja, det kanske jag inte är så säker på...  :)  

Jag tror det iaf, eftersom jag behöver behandla vissa poster mha vbscript innan jag gör en INSERT.

Mvh
Henrik

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

## #13 — devotion, 2008-01-23T15:42Z

> **@nders skrev:**
>
> Då jag har hört illasinnade rykten om att mitt inlägg inte förstås kommer här en förenkling.
>
> ```
> 	while not rs.EOF
> 	        strsql = strsql & "INSERT till tblContractTemplate ......" & vbcrlf
> 		rs.MoveNext
> 	wend
> 	....
> 	Conn.execute strsql,,128
> ```
>
> mvh

Finns det någo riska att  att göra en batch med en massa insert och update?

Behöver man använda transaktioner i några lägen?

Mvh
Henrik

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

## #14 — @nders, 2008-01-23T17:22Z

Transaktioner ska du använda om du vill att alla eller ingen av dina frågor i ett block ska gå igenom.

Risken med att köra SQL i batcher på detta vis är att du egentligen inte har någon kontroll på vad som går galet om något gör det. Om dina batcher är stora (eller rättare sagt: tar lång tid att köra) kan exekveringen avbrytas av connection-timeouten.

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

## #15 — devotion, 2008-01-23T20:19Z

Hej igen!

Jag har fäljande kod:

```
'**********************
'
'
'**********************

Option Explicit

'**********************

Sub main()

	dim Conn, Rs, sSQL
	dim sOldName, sOldSign, sNewName, sNewSign
	
	
	'Öppna databasen
	Set Conn=CreateObject("ADODB.Connection")
	Conn.Open Application.sDbConnectionString
	
	Set Rs=CreateObject("ADODB.Recordset")
	
	'SQL-fråga
	sSQL = "SELECT [Name], [Sign], [Custom1] AS NewName, [Custom2] AS NewSign FROM [tblUsers]"
	Rs.Open sSQL, Conn
	
	while not rs.EOF
	
		sOldName = Rs("Name")
		sOldSign = Rs("Sign")
		sNewName = Rs("NewName")
		sNewSign = Rs("NewSign")
		
		If sNewName <> "" then
			'tblTask
			sSQL= sSQL & "UPDATE [tblTask] SET [Modified] = GETDATE(), [User] = '" & sNewName & "' WHERE [User] = '" & sOldName & "'" & vbcrlf
			sSQL= sSQL & "UPDATE [tblTask] SET [Modified] = GETDATE(), [CreatedBy] = '" & sNewName & "' WHERE [CreatedBy] = '" & sOldName & "'" & vbcrlf
			sSQL= sSQL & "UPDATE [tblTask] SET [Modified] = GETDATE(), [Owner] = '" & sNewName & "' WHERE [Owner] = '" & sOldName & "'" & vbcrlf
			
			'tblTime
			sSQL= sSQL & "Update [tblTime] Set [Modified] = GETDATE(), [User] = '" & sNewName & "' WHERE [User] = '" & sOldName & "'" & vbcrlf
		end if
		rs.MoveNext
	wend
	
	Conn.Execute sSQL,,128
	
	Rs.Close
	Set Rs=Nothing
	Set Conn=Nothing
		
End sub
```

Det är ca 150 poster i tblUsers, ca 400 000 poster i tblTask, ca 100 000 poster i tblTime.

Det blir ju en himla massa frågor..  :)  

När jag kör koden så får jag följande felmeddelande:

> **Protocol error in tds stream**

Vad kan man göra åt detta?

Mvh
Henrik

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

## #16 — devotion, 2008-01-23T21:33Z

Hittade felet...

Av någon anledning följde värdet på sSQL med in i loopen. Löstes med att sätta sSQL till "" innan loopen. Sen ändrade jag på timeouten mha conn.Command=120

Mvh
Henrik

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

## #17 — emission, 2008-01-24T02:49Z

Det räcker med fyra frågor. Du behöver ingen loop.

```
UPDATE t SET t.Modified = GETDATE(), t.User = n.Custom1
FROM tblTask t
INNER JOIN tblUsers n ON t.User=n.Name AND n.Custom1<>''

UPDATE t SET t.Modified = GETDATE(), t.CreatedBy = n.Custom1
FROM tblTask t
INNER JOIN tblUsers n ON t.CreatedBy=n.Name AND n.Custom1<>''

UPDATE t SET t.Modified = GETDATE(), t.Owner = n.Custom1
FROM tblTask t
INNER JOIN tblUsers n ON t.Owner=n.Name AND n.Custom1<>''

UPDATE t SET t.Modified = GETDATE(), t.User = n.Custom1
FROM tblTime t
INNER JOIN tblUsers n ON t.User=n.Name AND n.Custom1<>''
```

(De tre översta går att slå ihop till en fråga, men det tjänar man inget på)

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

## #18 — devotion, 2008-01-24T17:39Z

> **emission skrev:**
>
> Det räcker med fyra frågor. Du behöver ingen loop.
> 
>
>
> ```
> UPDATE t SET t.Modified = GETDATE(), t.User = n.Custom1
> FROM tblTask t
> INNER JOIN tblUsers n ON t.User=n.Name AND n.Custom1<>''
> 
> UPDATE t SET t.Modified = GETDATE(), t.CreatedBy = n.Custom1
> FROM tblTask t
> INNER JOIN tblUsers n ON t.CreatedBy=n.Name AND n.Custom1<>''
> 
> UPDATE t SET t.Modified = GETDATE(), t.Owner = n.Custom1
> FROM tblTask t
> INNER JOIN tblUsers n ON t.Owner=n.Name AND n.Custom1<>''
> 
> UPDATE t SET t.Modified = GETDATE(), t.User = n.Custom1
> FROM tblTime t
> INNER JOIN tblUsers n ON t.User=n.Name AND n.Custom1<>''
> ```
>
> 
> 
> (De tre översta går att slå ihop till en fråga, men det tjänar man inget på)

Aha!   :)  

Det var ju fiffigt! (y)  

Mvh
Henrik

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

## #19 — @nders, 2008-01-24T18:19Z

Jag tyckte vi kom fram till att vi behövde en loop?

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

## #20 — devotion, 2008-01-24T21:02Z

> **@nders skrev:**
>
> Jag tyckte vi kom fram till att vi behövde en loop?

Hmmm... verkar som jag yrat runt lite och skrivit en annan fråga i en gammal tråd...

Kanske skulle splitta den...

Mvh
Henrik

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

---

Tråden på webben: https://www.webforum.nu/amne/asp/168133-göre-insert-i-en-loop
