SQL Server Creating Stored Procedure takes very long

3bygqnnd  于 2024-01-05  发布在  其他
关注(0)|答案(2)|浏览(90)

I have this stored procedure:

Create Procedure spVerhoogPrijzen1
    @artikelcategorie varchar(128),
    @ingangsdatum date
as 
    begin transaction

    update p
    set prijs = prijs * 1.1
    from artikelprijs p 
    join artikel a on a.artikelnr = p.artikelnr
    join artikelcategorie c on c.catcode = a.catcode
    where c.catomschrijving like @artikelcategorie
      and p.begindatum >= @ingangsdatum

    if @@ERROR <> 0
    begin
        rollback
        Raiserror('Je hebt iets fouts ingevuld', 16, 1)
    end
    commit

But when I run it, it takes forever to create the procedure. I stopped it after 15 minutes.

I'm using SQL Server 2014 Management Studio.

Artikel contains:

401 Kaviaar                 lux
402 Ganzenlever             lux
403 Vruchtenyoghurt Aardbei zuv
404 Volle Yoghurt           zuv
405 Magere Kwark            zuv

Artikelcategorie contains:

bio biologische artikelen  
lux luxe artikelen van de traitteur  
zuv zuivelartikelen

Artikelprijs contains:

401 21.50   2012-01-01  2099-12-31  
402 38.95   2012-01-01  2012-12-31  
402 39.95   2013-01-01  2013-10-31  
402 37.00   2013-11-01  2099-12-31  
403 16.25   2012-01-01  2013-07-31
nbysray5

nbysray51#

Can you please try the following procedure

ALTER PROCEDURE USP_VerhoogPrijzen1
    @artikelcategorie1 varchar(128),
    @ingangsdatum date
AS 
BEGIN

    CREATE TABLE #artikelprijs  (artikelnr INT,prijs DECIMAL(18,2),begindatum DATETIME)
    CREATE TABLE #artikel (artikelnr INT,name VARCHAR(100),catcode VARCHAR(10))
    CREATE TABLE #artikelcategorie (catcode VARCHAR(10),catomschrijving varchar(128))

    INSERT INTO #artikelprijs VALUES
    (401,21.50,'2012-01-01'), 
    (402,38.95,'2012-01-01'),
    (402,39.95,'2013-01-01'),
    (401,37.00,'2013-11-01'),
    (403,16.25,'2012-01-01')

    INSERT INTO #artikel VALUES
    (401,'Kaviaar','lux'),
    (402,'Ganzenlever','lux'),
    (403,'Vruchtenyoghurt Aardbei','zuv'),
    (404,'Volle Yoghurt','zuv'),
    (405,'Magere Kwark','zuv')

    INSERT INTO #artikelcategorie VALUES
    ('bio','biologische artikelen'),  
    ('lux','luxe artikelen van de traitteur'),  
    ('zuv','zuivelartikelen')  

    UPDATE P
    SET P.prijs = P.prijs * 1.1
    FROM #artikelprijs P
    INNER JOIN #artikel A on A.artikelnr = p.artikelnr
    INNER JOIN #artikelcategorie C on C.catcode = A.catcode
    WHERE c.catomschrijving like @artikelcategorie1 AND P.begindatum >= @ingangsdatum

    SELECT P.* FROM #artikelprijs P
    INNER JOIN #artikel A on A.artikelnr = p.artikelnr
    INNER JOIN #artikelcategorie C on C.catcode = A.catcode
    WHERE c.catomschrijving like @artikelcategorie1 AND P.begindatum >= @ingangsdatum

    IF @@ERROR <> 0
    BEGIN
        Raiserror('Je hebt iets fouts ingevuld', 16, 1)
    END

    SELECT * FROM #artikelprijs
    DROP TABLE #artikelprijs
    DROP TABLE #artikel
    DROP TABLE #artikelcategorie
END

--EXEC USP_VerhoogPrijzen1 'zuivelartikelen', '2012-01-01'

According to your join condition, one row is affected which catcode is 403 and value is 16.25. After update this value has changed to 17.88. Please check and Thanks.

yhxst69z

yhxst69z2#

I don't think you need a transaction for a single statement.

Give this a try:

Create Procedure spVerhoogPrijzen1
    @artikelcategorie varchar(128),
    @ingangsdatum date
as 
    update p
    set prijs = prijs * 1.1
    from artikelprijs p 
    join artikel a on a.artikelnr = p.artikelnr
    join artikelcategorie c on c.catcode = a.catcode
    where c.catomschrijving like @artikelcategorie
      and p.begindatum >= @ingangsdatum

    if @@ERROR <> 0
    begin
        Raiserror('Je hebt iets fouts ingevuld', 16, 1)
    end

相关问题