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
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
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.
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