Avatar billede misbruger Nybegynder
02. januar 2004 - 12:22 Der er 10 kommentarer og
1 løsning

Ret min sp

CREATE Proc sp_GetNextMemberNumber

    @CurrMemberNumber Int OUTPUT

AS

    DECLARE @Error Int
    SET @Error = 0
   
    DECLARE @NewMemberNumber int

BEGIN TRANSACTION NextMemberNumber

    SET @CurrMemberNumber = SELECT convert(numeric(9, Val) FROM SystemVariables WHERE Name = 'NextProfileId'

    SET @NewMemberNumber = @CurrMemberNumber + 1

    IF @@Error <> 0
    BEGIN
        SET @Error = 1
    END

    UPDATE SystemVariables SET Val = @NewMemberNumber WHERE Name = 'NextProfileId'

    IF @@Error <> 0 OR @@ROWCOUNT <> 1
    BEGIN
        SET @Error = 1
    END

    IF @Error = 0
    BEGIN
        COMMIT TRANSACTION NextMemberNumber
    END
    ELSE
    BEGIN
        ROLLBACK TRANSACTION NextMemberNumber
        SET @NewMemberNumber = 0
    END
GO

"Incorrect syntax near SELECT"

Er der en der kan afhjælpe mig?

Thanx!
Avatar billede trer Nybegynder
02. januar 2004 - 12:25 #1
SELECT  @CurrMemberNumber = convert(numeric(9, Val) FROM SystemVariables WHERE Name = 'NextProfileId'
Avatar billede trer Nybegynder
02. januar 2004 - 12:27 #2
Det er din SET @.... der skal rettes til det ovenstående.

I øvrigt - der vil kunne opstå problemer såfremt du har mange samtidige brugere - har du overvejet at bruge en IDENTIY fremfor selv at lave en tæller?
Avatar billede Slettet bruger
02. januar 2004 - 12:29 #3
SELECT  @CurrMemberNumber = convert(numeric(9), Val) FROM SystemVariables WHERE Name = 'NextProfileId'
Avatar billede misbruger Nybegynder
02. januar 2004 - 12:29 #4
Det er en nødvendighed at bruge en tæller, da den skal kunne skrives manuelt op...

Hvilke problemer mener du det vil kunne give...?
Avatar billede misbruger Nybegynder
02. januar 2004 - 12:33 #5
Vi snakker 200 - 300 simultane brugere, dog vil de kun skulle afvikle denne proc. en gang hver...
Avatar billede trer Nybegynder
02. januar 2004 - 12:37 #6
Du har godt nok pakket din sp ind i en navngiven transaktion, men din select og beregning sker før din update. Dvs. du læse på et tidspunkt hvor du har en læse-lås (share) på rækken, først senere får du en skrive (eksklusiv) lås.

Dermed *kan* to samtidige opdateringer kolidere. Du bør angive et låsehint i din select så du får en eksklusiv lås.

En anden mulighed er, at du summer hele dit statement op i updaten, så du ikke har en separat select.

begin transaction
update mytable set val = val + 1 where name = 'NextProfileId'
select @a = val from mytable where name = 'NextProfileId'
commit transaction
Avatar billede misbruger Nybegynder
02. januar 2004 - 12:53 #7
Altså.....


CREATE Proc sp_GetNextProfileId

    @NextProfileId Int OUTPUT

AS

    DECLARE @Error Int
    SET @Error = 0
   
BEGIN TRANSACTION NextProfileId

    UPDATE SystemVariables SET Val = convert(Text, convert(numeric, Val) + 1) WHERE Name = 'CurrentProfileId'
    SELECT @NextProfileId = convert(numeric, Val) FROM SystemVariables WHERE Name = 'CurrentProfileId'

    IF @@Error <> 0 OR @@ROWCOUNT <> 1
    BEGIN
        SET @Error = 1
    END

    IF @Error = 0
    BEGIN
        COMMIT TRANSACTION NextProfileId
    END
    ELSE
    BEGIN
        ROLLBACK TRANSACTION NextProfileId
        SET @NextProfileId = 0
    END
GO


Da Val er Text, hvorledes skal min convertion se ud?
Avatar billede trer Nybegynder
02. januar 2004 - 18:26 #8
Du mener forhåbentlig at val er en VARCHAR?

Datatypen TEXT er et blob felt - a la et LONG i Oracle og MEMO i Access.
Avatar billede misbruger Nybegynder
03. januar 2004 - 10:12 #9
I know!

Havde set forkert.... den er varchar!
Det var næste kolonne der var Text!
Avatar billede trer Nybegynder
03. januar 2004 - 11:40 #10
Ok, så burde din conversion som ovenfor være ok blot du retter "text" til "varchar". Ellers bruger jeg ofte CAST() men i praksis er der vist ingen forskel.
Avatar billede misbruger Nybegynder
03. januar 2004 - 12:09 #11
Jeg har bemærket, at det er nok at...

UPDATE SystemVariables SET Val = convert(numeric, Val) + 1 WHERE Name = 'CurrentProfileId'

Jeg behøver ikke at converte tilbage.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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