---
title: "Göra om vb-scriptfunktion till Stored Procedure"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/176950-göra-om-vb-scriptfunktion-till-stored-procedure"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "devotion"
published: "2009-02-15T18:31:39.000Z"
updated: "2009-02-17T15:00:02.000Z"
replies: 7
views: 402
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/176950-göra-om-vb-scriptfunktion-till-stored-procedure"
---

# Göra om vb-scriptfunktion till Stored Procedure

## #1 — devotion, 2009-02-15T18:31Z

Hej! :)  

Jag har en funktion som hämtar ett värde (id) från en tabell och därefter uppdaterar den.

Jag har börjat fundera lite på att ersätta detta med en stored procedure istället. Och kanske en transaktion med.

Har dock bara börjat nosa på SP, och skulle vilja ha en knuff i rätt riktning.

```
function GetNextId(sTableName)
	dim Conn, Rs
	dim sSQL

	GetNextId = -1

	Set Conn=CreateObject("ADODB.Connection")
	Conn.Open Application.sDbConnectionString
	Set Rs=CreateObject("ADODB.Recordset")
	sSQL = "SELECT [NextId] FROM [tblNextId] WHERE [Table]='" & sTableName & "'"
	Rs.Open sSQL, Conn

	if Rs.EOF then
		exit function
	else
		GetNextId=Rs.Fields(0)
	end If

	Rs.Close
	Set Rs=Nothing

	if GetNextId>0 then Conn.Execute "UPDATE [tblNextId] SET [NextId]=" & GetNextId+1 & " WHERE [Table]='" & sTableName & "'"
	Set Conn=Nothing
end function
```

Mvh
Henrik

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

## #2 — devotion, 2009-02-15T18:44Z

Började lite smått med denna:

```
CREATE PROCEDURE GetNextId 

@tableName varchar(32)

AS
BEGIN

	SET NOCOUNT ON;

   
	SELECT [NextId] FROM [tblNextId] WHERE [Table]=@tableName

	UPDATE [tblNextId] SET [NextId]=NextId+1 WHERE [Table]=@tableName
END
GO
```

Som kördes med:

```
exec GetNextId 'tblTime'
```

Den returnerar nästa id, så det verkar vara rätt.

Men, vad ska man mer tänka på?

Med tanke på prestanda, säkerhet mm?

Mvh
Henrik

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

## #3 — LarsG, 2009-02-15T19:25Z

Definiera en kolumn med attributet identity istället. Det är enklare, säkrare och snabbare.

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

## #4 — devotion, 2009-02-15T19:27Z

> **[LarsG skrev:](https://www.webforum.nu/p/1456665)**
>
> Definiera en kolumn med attributet identity istället. Det är enklare, säkrare och snabbare.

Kan du berätta mer? :)

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

## #5 — devotion, 2009-02-15T20:33Z

> **[LarsG skrev:](https://www.webforum.nu/p/1456665)**
>
> Definiera en kolumn med attributet identity istället. Det är enklare, säkrare och snabbare.

Nu läste jag en gång till och denna gång förstod jag vad du menade.  :p

Tyvärr kan jag inte göra något åt strukturen, utan det är uppbyggt på detta sätt.

Frågan är dock om man kan göra det bättre, än att dela ut id mha en vb-script funktion?

Mvh
Henrik

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

## #6 — LarsG, 2009-02-15T20:51Z

I så fall bör du lägga de båda frågorna inom en transaktion och använda holdlock i select-frågan för att undvika att samma id delas ut till flera. Att flytta frågorna till en procedur ger en (liten)  prestandavinst.

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

## #7 — Peter S, 2009-02-17T09:54Z

Detta kanske kan få dig på rätt spår:

```
CREATE PROCEDURE GetNextId 

@tableName varchar(32)

AS
BEGIN

	SET NOCOUNT ON;

	BEGIN TRAN
   
		SELECT [NextId] FROM [tblNextId] WITH(HOLDLOCK) WHERE [Table]=@tableName

		UPDATE [tblNextId] SET [NextId]=NextId+1 WHERE  [Table]=@tableName

	COMMIT
END
GO
```

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

## #8 — devotion, 2009-02-17T15:00Z

Det ser ju bra ut! :p   

Mvh
Henrik

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/176950-göra-om-vb-scriptfunktion-till-stored-procedure
