[ Astek @ 03.12.2011. 12:37 ] @
Da li je moguće u SP preneti preko neke promenljive uslov za WHERE klauzulu.
Otprilike ovako nekako:

....

@USLOV nvarchar..

....

.. SELECT * FROM tbl WHERE @USLOV...

Bilo kako samo da uslov za WHERE prosledim kao parametar.

Zahvaljujem unapred.



[ Dusan Kondic @ 03.12.2011. 17:07 ] @
Možeš da složiš komandu kao tekst pa da je izvršiš pomoću komande sp_executesql
npr:
Code:

@USLOV nvarchar..
....

DECLARE @SQL nvarchar(300)
SET @SQL = 'SELECT * FROM tbl WHERE ' + @USLOV
EXEC sp_executesql @SQL
[ Astek @ 03.12.2011. 18:29 ] @
Problem je u tome što imam proceduru od oko 200 redova, u okviru nje neki cursor gde u FOR delu moram da ubacim taj uslov.
...
ovako nekako:
DECLARE cursorCC cursor FOR SELECT polje FROM tabela WHERE @USLOV
....

[ Dusan Kondic @ 03.12.2011. 18:40 ] @
Mislim da bi trebao da preispitaš svoj kod (strukturu tabela i skript) jer su kursori u principu nepoželjni.
[ Zidar @ 05.12.2011. 15:14 ] @
Takodje nije pozeljno koristiti dinamicki kod za zadavanje parametara. Evo zasto:

Code:

DECLARE @USLOV nvarchar..
SET @Uslov = 'Id = 7; TRUNCATE TABLE Artikli ;'

DECLARE @SQL nvarchar(300)
SET @SQL = 'SELECT * FROM tbl WHERE ' + @USLOV
EXEC sp_executesql @SQL



Ovo se zove SQL injection. Varijabla @SQL ce da izgleda ovako:
Code:
SELECT * FROM tbl WHERE Id=1; TRUNCATE TABLE Artikli
i to ce sp_executesql lepo da izvrsi.

U SQL se paramatrizacija kverija resava upotrebom funkcija koje vracaju tabelu.
Code:
SELECT * FROM dbo.MyFunction(@Praam1, @param2, @Param3...)
U funkciji moze da bude i kursor, ako je bas neophodno.

Ako je situacija takva da se ne mogu definisati kolone za parametre unapred, onda je neki problem u pitanju. A ako koristis kursore, ima sanse da ima i vecih problema. Ne mora da znaci, kursori naravno nisu zabranjeni, ali mogu da ukazuju na nepotpuno razumevanje problma i kako SQL spada u celu sliku.