Rozsah platnosti proměnné   zodpovězená otázka

SQL

Ahoj, momentálně se trápím s jednou věcí. Na MS SQL serveru 2000 dělám v T-SQL procedury. Potřebuji získat pár pomocných hodnot a chtěl jsem k tomu využít tabulkovou proměnnou:

DECLARE @pomocnaTBL TABLE (datum DATETIME,jmeno NVARCHAR(30))

Pokud mám jednoduchý dotaz vše funguje jak mám. V T-SQL proceduře mám ale jednoduchou rozhodovací proceduru. Při snaze uložit proceduru mi to píše že musím nadeklarovat proměnnou. I když jsem před deklaraci dal klíčové slovo public, nepomohlo mi to. Potřeboval bych tedy poradit (obecně) jak SQL server určuje oblast platnosti proměnné.

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

Mohl bych vidět celý kód procedury?

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

Jistě zde je:

CREATE PROCEDURE prehledy_QRY_body_za_den_seznam_dat

@jmeno nvarchar(30)='nezadán',

@parametr1 nvarchar(50)='nezadán',

@parametr2 nvarchar(50)='nezadán',

@parametr3 nvarchar(50)='nezadán',

@parametr4 nvarchar(50)='nezadán',

@datumOd datetime,

@datumDo datetime,

@nacitatJmeno bit

DECLARE @seznamDat TABLE (datum DATETIME, jmeno NVARCHAR(30))

AS

IF @nacitatJmeno=1

BEGIN

INSERT INTO @seznamDat

SELECT datum_odeslani AS datum,jmeno

FROM tb_pozadavky

WHERE jmeno=@jmeno

AND stav=2

AND(datum_odeslani>=@datumOD AND datum_odeslani<=@datumDO)

GROUP BY zpracovano_datum,jmeno

ORDER BY jmeno,zpracovano_datum

INSERT INTO @seznamDat

SELECT zpracovano_datum,jmeno

FROM tb_zpracovano

WHERE jmeno=@jmeno

AND stav=2

AND(zpracovano_datum>=@datumOD AND zpracovano_datum<=@datumDO)

GROUP BY zpracovano_datum,jmeno

ORDER BY jmeno,zpracovano_datu

END

ELSE

IF @nacitatJmeno=0

BEGIN

INSERT INTO @seznamDat

SELECT datum_odeslani AS datum,jmeno

FROM tb_pozadavky

WHERE (referat=@parametr1 OR referat=@parametr2 OR referat=@parametr3 OR referat=@parametr4)

AND stav=2

AND(datum_odeslani>=@datumOD AND datum_odeslani<=@datumDO)

GROUP BY zpracovano_datum,jmeno

ORDER BY jmeno,zpracovano_datum

INSERT INTO @seznamDat

SELECT zpracovano_datum,jmeno

FROM tb_zpracovano

WHERE (referat=@parametr1 OR referat=@parametr2 OR referat=@parametr3 OR referat=@parametr4)

AND stav=2

AND(zpracovano_datum>=@datumOD AND zpracovano_datum<=@datumDO)

GROUP BY zpracovano_datum,jmeno

ORDER BY jmeno,zpracovano_datu

END

GO

Procedura toho dělá víc, momentálně mám ale problém s tímto blokem.

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

zkuste odstranit IF @nacitatJmeno=0

tento kod funguje:

declare @nacitatJmeno bit

SET @nacitatJmeno = 1

DECLARE @pomocnaTBL TABLE (ID INT PRIMARY KEY IDENTITY(1,1) ,datum DATETIME,jmeno NVARCHAR(30))

IF @nacitatJmeno = 0

BEGIN

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'x')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'x2')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'x3')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'x4')

END

else

BEGIN

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'Pavel')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'Pavel2')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'Pavel3')

insert into @pomocnaTBL (datum, jmeno) values (getdate(), 'Pavel4')

END

select * from @pomocnaTBL

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

Použijte syntaxi pro insert:

insert into @pomocnaTBL(datum,jmeno)

Dále bych doporučil:

DECLARE @pomocnaTBL TABLE (ID INT PRIMARY KEY IDENTITY(1,1) ,datum DATETIME,jmeno NVARCHAR(30))

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

Moc jsem to nepochopil. Mám to v podstatě stejné jako vy, jen s tím rozdílem že doplňuju data selectem a ne přes values. A ano máte pravdu ta druhá podmínka tam je zbytečná.

Ano, vím že by každá tabulka měla mít primární klíč, zde jsem to ale považoval za zbytečné, protože se pouze odešle výsledek aplikaci. Tam s daty pracuju dále. Ale díky za připomínku;)

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

Tak už jsem na to přišel. Pes byl zakopaný v tom, že deklarace proměnné musí být až za AS :)

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