OVH Cloud OVH Cloud

Question simple sur une procédure stockée

1 réponse
Avatar
Julien C.
Bonjour,

Je me mets doucement aux procédures stockées. J'aimerai en fait combiner ces
deux requêtes :

SELECT
COUNT(ItemId) AS ItemsCount
FROM Items
WHERE StoreId = @StoreId

Récupérer la valeur de ItemsCount et la mettre à jour dans la table Stores :

UPDATE
Stores
SET
ItemsCount = @ItemsCount
WHERE
StoreId = @StoreId

Comment dire que le résultat de la requête SELECT doit être affecté à une
variable et qu'ensuite j'utilise la valeur de cette variable pour la mettre
à jour dans une autre table ?

Merci !

Julien C.

1 réponse

Avatar
Steve Kass
Julien,

Si vous n'avez besoin de la valeur de ItemsCount qu'afin de mettre à
jour la table Stores:

update Stores set
ItemsCount = (
select count(*) from Items
where StoreId = @StoreId
)
where StoreId = @StoreId

Si vous voulez voir la valeur de ItemsCount comme résultat, ainsi que
faire le mise-à-jour:

declare @ItemsCount int
set @ItemsCount = (
select count(*) from Items
where StoreId = @StoreId
)
select @ItemsCount as ItemsCount
update Stores set
ItemsCount = @ItemsCount
where ItemId = @ItemId


Est-ce que le but est que les valeurs ItemsCount soient toujours
correctes? Une autre possibilité est de créér une vue indexée, ce qui
assure que les résultats sont correctes après toute requête UPDATE ou
INSERT sur Items, et que la sélection d'un ItemCount est efficace.
Voilà un exemple à partire de la bd Northwind:

create view ProductCountByOrderA with schemabinding as
select OrderID, count_big(ProductID) ProductCount
from dbo.[Order Details]
group by OrderID
go

create unique clustered index ProductCountByOrderA_uci
on ProductCountByOrderA(OrderID)
go

-- Si toute Order comprend un Product au moins,
-- ce 2ème vue n'est pas nécessaire.
create view ProductCountByOrder as
select
O.OrderID,
coalesce(PC.ProductCount,0) as ProductCount
from Orders O left join ProductCountByOrderA PC
on O.OrderID = PC.OrderID
go

select ProductCount from ProductCountByOrder
where OrderID = 11077
select ProductCount from ProductCountByOrder
where OrderID = 11111
go

drop view ProductCountByOrder, ProductCountByOrderA

SK

Julien C. wrote:

Bonjour,

Je me mets doucement aux procédures stockées. J'aimerai en fait combiner ces
deux requêtes :

SELECT
COUNT(ItemId) AS ItemsCount
FROM Items
WHERE StoreId = @StoreId

Récupérer la valeur de ItemsCount et la mettre à jour dans la table Stores :

UPDATE
Stores
SET
ItemsCount = @ItemsCount
WHERE
StoreId = @StoreId

Comment dire que le résultat de la requête SELECT doit être affecté à une
variable et qu'ensuite j'utilise la valeur de cette variable pour la mettre
à jour dans une autre table ?

Merci !

Julien C.