1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| CREATE TABLE pays
(
ID_pays int IDENTITY NOT NULL CONSTRAINT PK_pays PRIMARY KEY,
nom_pays varchar(32) NOT NULL CONSTRAINT UQ_pays_nom_pays UNIQUE,
prefixe_pays varchar(3) NOT NULL CONSTRAINT UQ_pays_prefixe_pays UNIQUE
)
GO
INSERT INTO dbo.pays (nom_pays, prefixe_pays) VALUES ('France', 'FR')
GO
CREATE FUNCTION fn_getPaysFromID (@_ID_pays int)
RETURNS varchar(3)
WITH SCHEMABINDING
AS
BEGIN
RETURN
(
SELECT prefixe_pays
FROM dbo.pays
WHERE ID_pays = @_ID_pays
)
END
GO
-- SELECT dbo.fn_getPaysFromID(1)
CREATE TABLE pays_commande_numero
(
ID_pays_commande_numero int IDENTITY NOT NULL CONSTRAINT PK_pays_commande_numero PRIMARY KEY,
ID_pays int NOT NULL CONSTRAINT FK_pays_commande_numero__ID_pays FOREIGN KEY(ID_pays) REFERENCES dbo.pays (ID_pays),
CONSTRAINT UQ_pays_commande_numero__ID_pays UNIQUE (ID_pays),
numero_commande int NOT NULL,
pays_commande AS (dbo.fn_getPaysFromID(ID_pays) + CAST(numero_commande AS varchar(10)))
)
GO
ALTER PROCEDURE ps_nouvelle_commande_ajouter
@_ID_pays int
, @_pays_commande varchar(13) OUTPUT
AS
BEGIN
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
IF NOT EXISTS
(
SELECT *
FROM dbo.pays_commande_numero
WHERE ID_pays = @_ID_pays
)
BEGIN
INSERT INTO dbo.pays_commande_numero (ID_pays, numero_commande)
VALUES (@_ID_pays, 0)
END
BEGIN TRANSACTION SET_KEY
UPDATE dbo.pays_commande_numero
SET numero_commande = numero_commande + 1
WHERE ID_pays = @_ID_pays
SELECT @_pays_commande = pays_commande
FROM dbo.pays_commande_numero
WHERE ID_pays = @_ID_pays
COMMIT TRANSACTION SET_KEY
END
GO
-- Exemple d'utilisation
DECLARE @new_pays_commande varchar(13)
EXEC dbo.ps_nouvelle_commande_ajouter
@_ID_pays = 1
, @_pays_commande = @new_pays_commande OUTPUT
SELECT @new_pays_commande |
Partager