none
Bug na SQL serveru v kurzorech RRS feed

  • Dotaz

  • Dobrý den,

    hlásím bug na SQL serveru 2019 s cumulativním updatem 8-9-10

    V kurzoru, pokud nastavuji proměnou pomocí SELECT a ten je NULL, nastaví se předchozí řádek.

    Pokud proměnnou nastavím pomocí SET, je to v pořádku.

    Problém je v tom, že metodu pomocí Select často používá dodavatel ERP systému.

    Poslala bych screen, ale tento účet nemám ověřený.

    Příklad:

    V prvním řádku pro @IDZboSklad existuje záznam a ve druhém nikoliv

    DECLARE @ID INT
    SET @ID = 1066191
    DECLARE @myid INT
    DECLARE @IDPoh int, @IDUm int, @IDZboSklad int, @IDVstav int
    
    IF EXISTS(SELECT * FROM TabDokladyZbozi WHERE ID=@ID AND IDSklad=N'047' AND DruhPohybuZbo=0)
    BEGIN
      SELECT @IDUm=ID FROM TabUmisteni WHERE Kod=N'Liberec' AND IDSklad=N'047'  
      IF @IDUm IS NOT NULL
      BegiN
        DECLARE crPol CURSOR LOCAL FAST_FORWARD
        FOR SELECT ID, IDZboSklad FROM TabPohybyZbozi WHERE IDDoklad=@ID AND TypVyrobnihoDokladu = (0)
        OPEN crPol
        
        WHILE 1=1
        Begin
          FETCH NEXT FROM crPol INTO @IDPoh, @IDZboSklad
          IF @@FETCH_STATUS <> 0 BREAK
    
            PRINT @IDUm
            PRINT @IDZboSklad
          SELECT @IDVstav=ID FROM TabVStavUmisteni WHERE IDStav=@IDZboSklad AND IDUmisteni=@IDUm
            SET @myid = (SELECT ID FROM TabVStavUmisteni WHERE IDStav=@IDZboSklad AND IDUmisteni=@IDUm)
            PRINT @myid
          PRINT @IDVstav
            PRINT @IDPoh
            PRINT '---'
          IF @IDVstav IS NULL
            BEGIN
              PRINT 'insert'
            END
    
    
            --UPDATE TabPohybyZbozi SET IdUmisteni=@IDVstav WHERE ID=@IDPoh
        End
        CLOSE crPol
        DEALLOCATE crPol
      EnD
    END



    Výsledek:

    6400
    107622
    57599 --správně
    57599 --špatně
    3066284
    ---
    6400
    107621
               --správně
    57599 --špatně, zde by měl být NULL
    3066285
    ---






    středa 5. května 2021 17:31

Odpovědi