Search code examples
sql-servert-sqlstored-procedures

Creating Stored Procedure takes very long


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  

Solution

  • 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.