webForumDet fria alternativet

Göra om vb-scriptfunktion till Stored Procedure

7 svar · 397 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

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

devotionMedlem sedan jan. 20013 582 inlägg
#2

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

LarsGMedlem sedan dec. 200012 464 inlägg
#3

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

devotionMedlem sedan jan. 20013 582 inlägg
#4

LarsG skrev:

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

Kan du berätta mer? :)

devotionMedlem sedan jan. 20013 582 inlägg
#5

LarsG skrev:

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

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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.

Peter SMedlem sedan dec. 20025 483 inlägg
#7

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
devotionMedlem sedan jan. 20013 582 inlägg
#8

Det ser ju bra ut! :p

Mvh
Henrik

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)