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:

--@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:

@ErrorID int output

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

Pro jistotu sem dávám celou proceduru:

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

		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

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
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

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