Chybná hodnota output parametru   zodpovězená otázka

SQL

Zdravím, potřeboval bych poradit s T-SQL transakcí. Buď něco soustavně přehlížím, nebo jsem něco špatně pochopil.

Zjednodušeně mám nějáký takovýto kód:

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
--@ErrorID=0 => vše ok
--@ErrorID=1 => neexistující záznam
--@ErrorID=2 => duplicitní plán
 
 
 
IF EXISTS (SELECT * FROM tb_01 WHERE ID=@id)
 
BEGIN
    IF EXISTS (SELECT * FROM tb_02 WHERE datum=@datum)
 
    BEGIN
        SET @ErrorID=2
    END
 
 
    ELSE
 
    BEGIN
 
 
        SET @ErrorID=0
        --provede další kód
    END
END
 
ELSE
 
BEGIN
    SET @ErrorID=1
END

Problém je následující:

@ErrorID je output parametr.

-Pokud je první IF FALSE vrátím se mi správně @ErrorID=1 (neexistující záznam) a druhý IF by se už neměl vyhodnocovat. To je v pořádku.

-Pokud je první IF TRUE vyhodnocuje se druhý IF.

-Pokud je druhý IF taky true, vrátí se mi @ErrorID=2 (duplicita). To je taky v pořádku

-Pokud je ale druhý IF FALSE mělo by se mi vrátit @ErrorID=0 (0 značí že je vše ok) a provede se kód který je za SET @ErrorID=0. A zde je problém, kód se mi sice provede což je správné ale pořád mi to vrací @ErrorID=2 a já nemůžu přijít na to proč, když ho nastavuju na nulu.

Nevidíte tam někdo někde prosím chybu?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takhle to vypadá v pořádku zkontroloval bych vstupní parametry a taky jestli se ti to opravdu dostane do toho druhýho IF, popr. tam hoď jak máš nadeklerovaný proměný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Do druhého ifu se to dostane, je tam totiž umístěn kód který funguje správně a spustí se kdy má. Zlobí jen ten output parametr a jsem z toho docela jelen. Parametr je nadeklarovaný klasicky:

1
@ErrorID int output

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro jistotu sem dávám celou proceduru:

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
USE [NKPO]
GO
/****** Object:  StoredProcedure [dbo].[QRY_novy_plan]    Script Date: 05/28/2009 07:11:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--VLOŽÍ PLÁN DO SCHEDULERU
 
ALTER PROCEDURE [dbo].[QRY_novy_plan]
 
 
@podsmlouva_id  int,
@rizikova_skupina_id    int,
@prirazka_id    int,
@prijem money,
@smrt_jakakoliv bit,
@VIP_smrt_jakakoliv bit,
@castka_smrt_jakakoliv  money,
@pojistne_smrt_jakakoliv    money,
@smrt_uraz  bit,
@VIP_smrt_uraz  bit,
@castka_smrt_uraz   money,
@pojistne_smrt_uraz money,
@trvale_nasledky    bit,
@VIP_trvale_nasledky    bit,
@castka_trvale_nasledky money,
@pojistne_trvale_nasledky   money,
@invalidita_uraz    bit,
@VIP_invalidita_uraz    bit,
@castka_invalidita_uraz money,
@pojistne_invalidita_uraz   money,
@invalidita_jakakoliv   bit,
@VIP_invalidita_jakakoliv   bit,
@castka_invalidita_jakakoliv    money,
@pojistne_invalidita_jakakoliv  money,
@aktivni    bit,
@skupina_id int,
@datum_provedeni    datetime,
@uzivatel varchar(50),
@aktivni_plan bit,
@ErrorID int output
 
--@ErrorID=0 => vše ok
--@ErrorID=1 => neexistující podsmlouva
--@ErrorID=2 => duplicitní plán
 
AS
 
--DECLARE @cas_zalozeni datetime
--SET @cas_zalozeni=getdate()
 
IF EXISTS (SELECT * FROM tb_01 WHERE ID=@podsmlouva_id)
 
     
 
BEGIN
    IF EXISTS (SELECT * FROM tb_02 WHERE datum_provedeni=@datum_provedeni AND podsmlouva_id=@podsmlouva_id)
 
    BEGIN
        SET @ErrorID=2
    END
 
 
    ELSE
 
    BEGIN
 
        SET @ErrorID=0
 
        INSERT INTO tb_02
             (podsmlouva_id,rizikova_skupina_id,prirazka_id,prijem,smrt_jakakoliv,VIP_smrt_jakakoliv,castka_smrt_jakakoliv,
            pojistne_smrt_jakakoliv,smrt_uraz,VIP_smrt_uraz,castka_smrt_uraz,pojistne_smrt_uraz,trvale_nasledky,
            VIP_trvale_nasledky,castka_trvale_nasledky,pojistne_trvale_nasledky,invalidita_uraz,VIP_invalidita_uraz,
            castka_invalidita_uraz,pojistne_invalidita_uraz,invalidita_jakakoliv,VIP_invalidita_jakakoliv,
            castka_invalidita_jakakoliv,pojistne_invalidita_jakakoliv,aktivni,skupina_id,datum_provedeni,aktivni_plan)
 
        VALUES(@podsmlouva_id,@rizikova_skupina_id,@prirazka_id,@prijem,@smrt_jakakoliv,@VIP_smrt_jakakoliv,
            @castka_smrt_jakakoliv,@pojistne_smrt_jakakoliv,@smrt_uraz,@VIP_smrt_uraz,@castka_smrt_uraz,@pojistne_smrt_uraz,@trvale_nasledky,
            @VIP_trvale_nasledky,@castka_trvale_nasledky,@pojistne_trvale_nasledky,@invalidita_uraz,@VIP_invalidita_uraz,
            @castka_invalidita_uraz,@pojistne_invalidita_uraz,@invalidita_jakakoliv,@VIP_invalidita_jakakoliv,
            @castka_invalidita_jakakoliv,@pojistne_invalidita_jakakoliv,@aktivni,@skupina_id,@datum_provedeni,@aktivni_plan)
 
 
            --zjištění získaného ID
        DECLARE @IDplanu int
        SET @IDplanu=(SELECT id FROM tb_02 WHERE podsmlouva_id=@podsmlouva_id AND datum_provedeni=@datum_provedeni)
 
            --zápis do transakčního logu
        INSERT INTO tb_event_log(event_id,event,tableName,userName,ok)
        VALUES(@IDplanu,'Plán podsmlouvy-vložení nového záznamu. ID plánu ' + convert(varchar(20),@IDplanu),'tb_podsmlouvy_scheduler',@uzivatel,1)
 
         
 
    END
END
 
ELSE
 
BEGIN
    SET @ErrorID=1
END

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jediný co mně napadá, jestli nahodou tu proceduru nevolaš v cyklu, protože v tom druhým IF vkládáš záznam do tabulky tb_02 což je tabulka, kterou kontroluješ v prvním IF. Hoď ten SET @ErrorID=0 až na konec za insert tb_event_log.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud máš SQL Server 2008 a k němu Management Studio 2008, tak se to dá odkrokovat, což doporučuji. Bůhví proč se to nevolá, tímhle to zjistíte. Ale je to divné, bude to nějaká blbost.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To Michal Kezr:

V cyklu by se to volat nemělo. A Set @ErrorID jsem původně na konci měl a výsledek byl bohužel stejný.

To Tomáš Herceg:

Bohužel jedu na SQL serveru 2000. Chtěl jsem novou verzi, ale toto je jedna z věcí které nemohu ovlivnit.

Zkusil jsem i znovu vytvořit proceduru pro případ, že by se něco pohádalo při kompilaci, ale bez efektu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak mám další poznatek, přidal jsem další output parametr a přidal jsem ho hned za

1
2
SET @ErrorID=0
set @aa=0

tzn. do toho ifu k insertům kde jsou problémy. Nikam jinam jsem ho nedával. Sledoval jsem návratovou hodnotu a vrací mi to prázdný parametr.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jsem se pokusil to nasimulovat a normalne to funguje

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @PARAMETR INT
DECLARE @PARAMETR2 INT
DECLARE @VYSTUPNIPARAMETR INT
 
SET @PARAMETR = 2
SET @PARAMETR2 = 1
 
SET @VYSTUPNIPARAMETR = 0
 
IF @PARAMETR = 1
    BEGIN
        IF @PARAMETR2 = 0
            SET @VYSTUPNIPARAMETR =0
        ELSE
            SET @VYSTUPNIPARAMETR =1
    END
ELSE
    SET @VYSTUPNIPARAMETR =2
 
SELECT @VYSTUPNIPARAMETR

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste to ještě s output parametry místo nadeklarovaných proměnných jako to mám já. Schválně jestli bude výsledek stejný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže nakonce (konečně) vyřešeno.

Zabralo staré dobré vystoupit-nastoupit.

Po restartu SQL serveru je vše ok.

Všem děkuji za příspěvky:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback