[ CallMeSaMaster @ 24.07.2009. 23:45 ] @
Pozdrav svima,

imam jedan naizgled(bar meni) trivijalan problem:

Imam proceduru koja radi update podataka, recimo setuje neki status uposlenika.
Ja bih htio to odradim tako da u SP proslijedim listu ID-eva uposlenika i da odradim update i to ovako:

@sqlWhere nvarchar(100)

as

update uposlenici set Aktivan = 1
where uposlednikid in (@sqlWhere)

Naravno UposlenikID je int, autoincrement, PK i sta god da proslijedim update padne

Primjer

recimo da sma iz code-a proslijedio sqlWhere kao '21', '23','120'

Gornji dio upodate pada! Ali ako direktno kucam u Query

update uposlenici set Aktivan = 1
where uposlednikid in ('21','23','120')

onda radi.

Mozeli neko pomoci kako da setujem ovaj ulazni parametar?

LP
[ Fedya @ 25.07.2009. 10:07 ] @
Ako bas moras tako onda mozes da napises nesto kao

Code:

declare @sql nvarchar(255)

set @sql = 'update uposlenici set Aktivan = 1 where uposlednikid in (' + @sqlWhere + ')'

exec @sql


Mada bi bilo bolje da niz prosledis kao xml, parsiras u proceduri u privremenu tabelu...
[ M E N E @ 26.07.2009. 08:50 ] @
zar nije bolje da primas jedan ID, a proceduru pozivas u petlji?
To je, ako se ne varam, najopstije resenje... Ovde imas ogranicenje broja karaktera (100) , ili (255)... a i sve mi deluje kao hakeraj; a sa bazom se ne hakerise :-)
[ CallMeSaMaster @ 26.07.2009. 11:42 ] @
Citat:

zar nije bolje da primas jedan ID, a proceduru pozivas u petlji?
To je, ako se ne varam, najopstije resenje... Ovde imas ogranicenje broja karaktera (100) , ili (255)... a i sve mi deluje kao hakeraj; a sa bazom se ne hakerise :-)


Nije hakeraj. Objasnit cu ti u cemu je bio problem iako sam ga drugacije riejsio:

Apliakcija koju trenutno radim funkcionise na sledecm principu:

Sef Odjela moze da aktivira radnike koji u nekom trenutku mogu da rade neke operacije. Recimo On za danas moze da odredi 5 radnika koji ce moci da rade storno racuna. Da bi to uradio, dobije listu svih radnika koji su mu na raspolaganju i klikom na svaki pamti se id radnika. Posto ja pravim program, znam da sigurno nikad nece imat vise od 10 radnika :) i zbog toga to ogranicenje od 100 karaktera...

Posle se izvrsavanjem ove proc radnici aktiviraju i to je to...Nikakav hakeraj, to je za malu djecu. Ja upravo radim u drugom smjeru :)

To je bila poenta problema...

Rijesio sam to tako sto sam jednostavo iz code-a uradio update a ne preko sp...
[ Fedya @ 26.07.2009. 12:53 ] @
Citat:
M E N E: zar nije bolje da primas jedan ID, a proceduru pozivas u petlji?
To je, ako se ne varam, najopstije resenje... Ovde imas ogranicenje broja karaktera (100) , ili (255)... a i sve mi deluje kao hakeraj; a sa bazom se ne hakerise :-)


Ne bih se slozio ni po jednom pitanju. Pozivanje procedure iz DB layera u petlji je sto se optimizacije tice najgore resenje, posebno ako se baza i aplikacija nalaze na razlicitm masinama.
Sto se broja karaktera tice, samo sam lupio 255, uvek mozes da stavis nvarchar(max) i izbegnes taj problem.

Ja bih taj problem resio tako sto bih napravio proceduru koja prima xml. Brzo googlanje je vratilo link sa vrlo jednostavnim primerom: http://weblogs.asp.net/jgallow...-2005-with-xml-parameters.aspx trebalo bi da resi problem.
[ .:Marvin:. @ 28.07.2009. 07:37 ] @
Po meni, resenje sa dinamickim SQLom koje je Fedya ponudio sasvim zadovoljava.

Drugo (a slicno) resenje je da napravi UDF koja parsira string sa vrednostima odvojenim zarezom a kao rezultat vraca tabelu, pa onda koristi ono sto je naveo u prvom mejlu.
Onda bi mogao da ima:

Code:

update uposlenici set Aktivan = 1
where uposlednikid in (select vrednost from dbo.my_parsing_UDF(@sqlWhere))