Avatar billede wedia Nybegynder
13. april 2012 - 10:37 Der er 8 kommentarer og
1 løsning

T-SQL problem

Hej Eksperter,

Jeg har et problem med at få min storeprocedure til at retuner id'et på det seneste oprettet element jeg får denne fejl meddelelse :qData: Missing SQL property
min storeprocedure kan ses herunder, jeg har også prøvet at bruge : SELECT @@IDENTITY AS [@@IDENTITY] istedet for SCOPE_IDENTITY() med samme resultat!

CREATE PROCEDURE dbo.[AddUser]

@Name varchar(max),
@UserName varchar(max),
@Email varchar(max),
@Password varchar(max)


AS
BEGIN
INSERT INTO Users (Name,UserName,Email,Password,CreateDate)
VALUES (@Name,@UserName,@Email,@Password,GETDATE())
 
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
 
END
Avatar billede arne_v Ekspert
13. april 2012 - 14:14 #1
Hvordan ser din kaldende kode ud?
Avatar billede arne_v Ekspert
13. april 2012 - 14:14 #2
PS: Jeg synes at du skullle bruge et ikke-keyword som alias!
Avatar billede mireigi Novice
20. april 2012 - 15:31 #3
Sikkert et dumt spørgsmål, men har du sørget for, at din primærnøgle bliver sat når du indsætter?
Avatar billede wedia Nybegynder
27. april 2012 - 10:50 #4
Det er mare mig der har siddet og sovet for at sikre at den samme bruger ikke blev oprettet to gange havde jeg til føjet en if sætning og det var den der fejlet !! men smid et svar så i kan få nogle points for jeres ulejlighed!!

Så koden der virker ser sådan her ud til andre der skulle have et ligende problem:

CREATE PROCEDURE dbo.[AddUser]

@Name varchar(max),
@UserName varchar(max),
@Email varchar(max),
@Password varchar(max)


AS

IF NOT EXISTS (Select Id From Users where UserName= @UserName)
BEGIN

INSERT INTO Users (Name,UserName,Email,Password,CreateDate)
VALUES (@Name,@UserName,@Email,@Password,GETDATE())

SELECT SCOPE_IDENTITY() AS [Id]
END
ELSE
BEGIN

Select Id From Users where UserName = @UserName

END
Avatar billede mireigi Novice
27. april 2012 - 15:59 #5
Jeg vil mene, at det vil være mere korrekt, at lave et uniqueindex på UserName.

Så skal du ikke selv teste det, og det er sikkert også hurtigere.

Kan så ikke lige huske, hvordan du så fanger fejlen efterfølgende, men der kan arne_v sikkert hjælpe lidt :)
Avatar billede arne_v Ekspert
02. maj 2012 - 03:49 #6
Jeg er helt enig om at et unikt index paa username er bedre.

Koden i #4 kan have samtidigheds problemer medmindre der bruges transaktioner og et hoejt transaction isolation level.

Fange fejlen ved insert af duplikat kan haandteres paa forskellig vis:
- i applikationen som faar en fejl ved kald af SP
- i SP (fra SQLServer 2005 kan man nemlig bruge TRY CATCH i en SP!)
Avatar billede arne_v Ekspert
02. maj 2012 - 03:49 #7
og et svar fra mig
Avatar billede mireigi Novice
02. maj 2012 - 09:07 #8
Jeg mente bare at der fandtes en anden løsning end Try-Catch, der jo koster lidt på performance. Men jeg husker måske forkert?
Avatar billede arne_v Ekspert
03. maj 2012 - 01:14 #9
Maaske er der en anden loesning, men jeg kender den ikke.

Jeg ville ikke bekymre mig over over performance af try catch for bruger oprettelse.

Lad os sige at det koster 1 ms mere CPU tid end alternativet. Og lad os sige at sitet faar 100000 nye bruger om aaret. Og lad os sige at alle fejler en gang. Det vil braende ca. 0.25 CPU sekund mere af i doegnet.

Der er uden tvivl andre ting som vil give mere at optimer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester