devotionMedlem sedan jan. 20013 582 inlägg 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 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 Definiera en kolumn med attributet identity istället. Det är enklare, säkrare och snabbare.
devotionMedlem sedan jan. 20013 582 inlägg
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 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 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