---
title: "loopa igenom en sträng i en Stored procedure"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/187743-loopa-igenom-en-sträng-i-en-stored-procedure"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Vinnaren"
published: "2011-09-08T17:45:07.000Z"
updated: "2011-09-09T10:53:50.000Z"
replies: 4
views: 925
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/187743-loopa-igenom-en-sträng-i-en-stored-procedure"
---

# loopa igenom en sträng i en Stored procedure

## #1 — Vinnaren, 2011-09-08T17:45Z

Hej alla!

Har följande:

```
ALTER PROCEDURE dbo.Page_UpdateOrder
	(
	@BlogId int,
	@OrderIdString varchar(max)
	)
AS
DECLARE @UnitPage int
DECLARE @idx int
DECLARE @tmp1 varchar(12)
DECLARE @tmp2 varchar(12)
DECLARE @ids varchar(max)
DECLARE @MyOrder int = 0
DECLARE @MenuId int
BEGIN TRY
BEGIN TRANSACTION

SET @UnitPage = (SELECT COUNT(*) FROM Menu WHERE BlogId = @BlogId)

UPDATE Menu SET [Order] = @UnitPage, Show = 0 WHERE BlogId = @BlogId

SELECT @idx = CHARINDEX(',', @OrderIdString)

WHILE (@idx > 0)
BEGIN

	SET @MyOrder = (@MyOrder + 1)

	SET @tmp1 = LEFT(@OrderIdString, @idx - 1)
	SET @ids = RIGHT(@OrderIdString, LEN(@OrderIdString) - @idx)
	SET @idx = CHARINDEX(',', @ids)

	SET @MenuId = CONVERT(INT, @tmp1)

	if not exists(SELECT 1 FROM Menu WHERE BlogId = @BlogId AND MenuId = @MenuId)
		INSERT INTO Menu(MenuId, BlogId, Show, [Order]) VALUES(@MenuId, @BlogId, 1, @MyOrder)
	else
		UPDATE Menu SET [Order] = @MyOrder, Show = 1 WHERE BlogId = @BlogId AND MenuId = @MenuId 

END

COMMIT TRANSACTION
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000);
SELECT @ErrorMessage = ERROR_MESSAGE();
RAISERROR (@ErrorMessage, 16, 1);

END CATCH
```

Jag vill kunna skicka in en sträng(@OrderIdString) som kan se ut: 3,2,1,2 och då loopa genom dessa nummer. (Ska även gå att enbart skicka in en 3 utan något , efter)
Som det är nu får jag ut varje siffra med ett , efter. vilket gör att den krashar vid SET @MenuId = CONVERT(INT, @tmp1)

Hur löser man detta?  :stud

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

## #2 — doggelito, 2011-09-08T19:18Z

Till det använder man enklast en split funktion: 
<http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648>

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

## #3 — Vinnaren, 2011-09-08T20:23Z

Härligt, tack.

Tänkte köra på:

```
ALTER FUNCTION dbo.Split
(
	@RowData varchar(max),
	@SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
	Id int identity(1,1),
	Data nvarchar(100)
) 
AS  
BEGIN 
	Declare @Cnt int
	Set @Cnt = 1

	While (Charindex(@SplitOn,@RowData)>0)
	Begin
		Insert Into @RtnValue (data)
		Select 
			Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

		Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
		Set @Cnt = @Cnt + 1
	End
	
	Insert Into @RtnValue (data)
	Select Data = ltrim(rtrim(@RowData))

	Return
END
```

Hur tar jag emot resultatet i den lagrade procedurern och loopar igenom raderna?

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

## #4 — doggelito, 2011-09-09T06:17Z

Du joinar bara med tabellen du vill hämta info ur.
Ex:

```
select o.OrderID, o.OrderDate
from Orders o
inner join dbo.Split('1,2,3,4,5,6', ',') temp on o.OrderID = temp.Data
```

Sen skulle du nog göra om fältet Data i funktionen från nvarchar(100) till en int istället!

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

## #5 — Vinnaren, 2011-09-09T10:53Z

ok, tach, men jag hade tänkt att antingen köra en insert alt. update om raden finns eller ej i databasen. Därför jag tänkte att man var tvungen att först loopa genom varje rad från det spliten returnerade och sen antingen köra en insert eller update.

Jag vill alltså inte hämta ut något från mina tabeller utan köra update/indert.

Måste väl gå?

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/187743-loopa-igenom-en-sträng-i-en-stored-procedure
