webForumDet fria alternativet

Fetcha AutoID

Databaser & SQL

9 svar · 296 visningar · startad av SteveP

Medlem sedan mars 2003772 inlägg
Frågan#1

När jag gjort en INSERT så skapas ett unikt ID för posten.
Kan jag på nåt sett få tag på det ID't i en variabel?

Trigger kanske vore lämpligast?

Jag hade tänkt mig nåt sånthär:

CREATE trigger tg_SelectID_LCPFiles on tblLCPFiles
for insert
as

select  <IDT som Skapades> as LatestID from tblLCPFiles

Men hur selectar jag ID't som precis skapades?

Är detta åt rätt håll?

select @LCPFileID = LCPFileID from Created
Medlem sedan juni 200032 967 inlägg
#2

variabeln @@IDENTITY innehåller räknarvärdet för den nyss insatta posten. Alltså:

SELECT @@IDENTITY

Mvh

Medlem sedan mars 2003772 inlägg
#3

Är @@IDENTETY alltid Primary keyn?

Medlem sedan juni 200032 967 inlägg
#4

Nej, det är räknarvärdet. Det spelar ingen roll vilket fält som är primärnyckel.

mvh

Medlem sedan mars 2003772 inlägg
#5
	strSQL = "SpLCPFiles_Insert " _
				& ContactID & ",'" _
				& OpenDate & "'"

	ObjConn.Execute(strSQL)
	Response.Write ObjRs("NewID")

SP'n ser ut såhär

CREATE PROCEDURE spLCPFiles_Insert

	@ContactID	INT,
	@OpenDate	DATETIME

AS

INSERT INTO TblLCPFiles
	(
	ContactID,
	OpenDate
	)

VALUES
	(
	@ContactID,
	@OpenDate
	)

SELECT @@IDENTITY AS NewID
GO

Jag har kört den i Query Analyzer och den returnerar ett fält med det nya ID't och fältet heter NewID

Men när jag försöker skriva ut det med Response.Write ObjRs("NewID")

Så får jag Item cannot be found in the collection corresponding to the requested name or ordinal.

Medlem sedan juni 200032 967 inlägg
#6

Det är för att din procedur faktiskt returnerar två recordsets. Det första är helt tomt, med informationen "1 record(s) affected", och det andra innehåller den information du vill ha. Du kommer ifrån detta genom att överst i din procedur stänga av funktionen som räknar hur många rader som påverkats.

CREATE PROCEDURE spLCPFiles_Insert

	@ContactID	INT,
	@OpenDate	DATETIME

AS

[b]SET NOCOUNT ON[/b]

INSERT INTO TblLCPFiles
	(
	ContactID,
	OpenDate
	)

VALUES
	(
	@ContactID,
	@OpenDate
	)

SELECT @@IDENTITY AS NewID
GO

Mvh

Medlem sedan mars 2003772 inlägg
#7

Det gjorde ingen skillnad tyvärr

CREATE PROCEDURE spLCPFiles_Insert

	@ContactID	INT,
	@OpenDate	DATETIME

AS

SET NOCOUNT ON

INSERT INTO TblLCPFiles
	(
	ContactID,
	OpenDate
	)

VALUES
	(
	@ContactID,
	@OpenDate
	)

SELECT @@IDENTITY AS NewID
GO
Medlem sedan juni 200032 967 inlägg
#8

Hmm. Lustigt. Inte för jag vet vad det skulle göra för skillnad, men prova att slänga bort GO ur koden. Jag kan inte tro att det skulle behövas.

Mvh

Medlem sedan mars 2003772 inlägg
#9

Det var en dum miss av mig :)

Jag öppnade inte med ObjRs
Såhär hade jag innan som du ser ovan.

ObjConn.Execute(strSQL)

Bytte ut det mot

Set ObjRs = ObjConn.Execute(strSQL)
Medlem sedan juni 200032 967 inlägg
#10

Aha, så allt väl, och kakorna smakar mao?

Mvh

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)