de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
Anonymný používateľ
Question

Skontrolujte, či existuje riadok, inak vložte

Potrebujem napísať uloženú procedúru T-SQL, ktorá aktualizuje riadok v tabuľke. Ak riadok neexistuje, vloží ho. Všetky tieto kroky zabalí transakcia.

Je to pre rezervačný systém, takže to musí byť atomické a spoľahlivé. Musí vrátiť true, ak bola transakcia vykonaná a let bol rezervovaný.

Som nováčikom v T-SQL a nie som si istý, ako použiť @@rowcount. Doteraz som napísal toto. Som na správnej ceste? Som si istý, že je to pre vás jednoduchý problém.

-- BEGIN TRANSACTION (HOW TO DO?)

UPDATE Bookings
 SET TicketsBooked = TicketsBooked + @TicketsToBook
 WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)

-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert 
-- the row and return FALSE

IF @@ROWCOUNT = 0 
BEGIN

 INSERT INTO Bookings ... (omitted)

END

-- END TRANSACTION (HOW TO DO?)

-- Return TRUE (How to do?)
225 2009-03-12T18:17:29+00:00 3
 Whymarrh
Whymarrh
Edited question 16 apríl 2017 в 3:38
Programovanie
sql
sql-server
sql-server-2008
tsql
This question has 1 odpoveď in English, to read them log in to your account.
Gregory  A Beamer
Gregory A Beamer
12 marec 2009 в 6:21
2009-03-12T18:21:41+00:00
Viac na
Zdroj
Upraviť
#8893318

Predpokladám, že pre každý let je určený jeden riadok? Ak áno:

IF EXISTS (SELECT * FROM Bookings WHERE FLightID = @Id)
BEGIN
    --UPDATE HERE
END
ELSE
BEGIN
   -- INSERT HERE
END

Predpokladám to, čo som povedal, pretože váš spôsob môže spôsobiť prebookovanie letu, keďže vloží nový riadok, keď je k dispozícii maximálne 10 leteniek a vy rezervujete 20.

150
0
 TheTXI
TheTXI
12 marec 2009 в 6:23
2009-03-12T18:23:51+00:00
Viac na
Zdroj
Upraviť
#8893319

Toto som musel urobiť len nedávno:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[cjso_UpdateCustomerLogin]
    (
      @CustomerID AS INT,
      @UserName AS VARCHAR(25),
      @Password AS BINARY(16)
    )
AS 
    BEGIN
        IF ISNULL((SELECT CustomerID FROM tblOnline_CustomerAccount WHERE CustomerID = @CustomerID), 0) = 0
        BEGIN
            INSERT INTO [tblOnline_CustomerAccount] (
                [CustomerID],
                [UserName],
                [Password],
                [LastLogin]
            ) VALUES ( 
                /* CustomerID - int */ @CustomerID,
                /* UserName - varchar(25) */ @UserName,
                /* Password - binary(16) */ @Password,
                /* LastLogin - datetime */ NULL ) 
        END
        ELSE
        BEGIN
            UPDATE  [tblOnline_CustomerAccount]
            SET     UserName = @UserName,
                    Password = @Password
            WHERE   CustomerID = @CustomerID    
        END

    END
2
0
 JoshBerke
JoshBerke
12 marec 2009 в 6:25
2009-03-12T18:25:20+00:00
Viac na
Zdroj
Upraviť
#8893320

Na dosiahnutie tohto cieľa môžete použiť funkciu Zlúčenie. Inak môžete urobiť:

declare @rowCount int

select @[email protected]@RowCount

if @rowCount=0
begin
--insert....
 Ry-
Ry-
Edited answer 10 júl 2011 в 1:44
1
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Zuxriddin Muydinov
Registered pred 11 hodinami
2
Денис Анненский
Registered pred 2 dňami
3
365
Registered pred týždňom
4
True Image
Registered pred týždňom
5
archana agarwal
Registered pred týždňom
BG
DA
DE
EL
ES
FR
ID
IT
JA
KO
NL
PT
SK
SL
TR
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora