Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako stored proceduru sa vise parametara pozvati samo jedanput

[es] :: .NET :: Kako stored proceduru sa vise parametara pozvati samo jedanput

[ Pregleda: 3593 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bigtime
Vladimir Dimitrijevic
Beograd

Član broj: 32587
Poruke: 120
91.150.84.*



Profil

icon Kako stored proceduru sa vise parametara pozvati samo jedanput17.06.2007. u 08:02 - pre 205 meseci
Pozdrav,
Imam proceduru u Northwind bazi koju pozivam iz aplikacije i imam jednu promenljivu. Ako u aplikaciji odaberem vise od jednog OrderID broja iz [Order Details] tabele, nece mi grupisati podatke, nego ce dva puta ispisati isti ProductID. Evo koda:


Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID = '10249'
GROUP BY ProductID



Ukoliko stavim i OrderID = '10250' onda ce se procedura dva puta izvrsiti i dobicu dva ProductID sa istim brojem, a zeleo bih da u listi svih ProductID pise samo jedan. Evo i rezultata:
14
51
41
51
65


Pokusao sam sa DISTINCT, GROUP BY, ali ne prolazi...
Da li neko ima mozda pametnu ideju kako bih ovaj problem mogao da resim?
Hvala puno.

Pozdrav,
Vlada
 
Odgovor na temu

majstor_01

Član broj: 60008
Poruke: 63
*.ptt.yu.



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput18.06.2007. u 00:31 - pre 204 meseci
Daj dizajn tabele orders...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput18.06.2007. u 15:25 - pre 204 meseci
Ne mozes ovako. Jedina SQL komanda koja tebi moze da odradi ovaj posao je:

Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID IN ('10249', 'itd', 'itd', 'koliko', 'hoces', 'elemenata')
GROUP BY ProductID


Problem je sto je ova struktura nekompatibilna sa parametrima stored procedure (gornja lista se ne moze proslediti kao parametar). Imas tri alternative:

1. Da ne koristis stored proceduru nego da dinamicki odredis gornji SQL i izvrisis kroz adapter/command, kako vec hoces

2. Da sacekas Orca-u i da iskoristis DLINQ for DataSet da odradis svoju naknadnu agregaciju nakon x poziva stored procedure za svaki red posebno.

3. Da radis softverski agregaciju nad tvojim datasetom (vidi pseudokod), nakon x poziva stored procedure za svaki red posebno:

Code:

foreach (red1 in tabela1.Rows)
{
   if tabela2.sadrziKljuc(red1.productid) 
       tabela2.Red(red1.productid).Quantity += red1.Quantity
   else
      tabela2.DodajRed(red1.productid, red1.Quantity)
}


Prava c# sintaksa je drugacija, ne znam napamet i nemam VS sad, trebalo bi da se lako snadjes sa ovim psudo kodom.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bigtime
Vladimir Dimitrijevic
Beograd

Član broj: 32587
Poruke: 120
*.dial.scnet.yu.



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput23.06.2007. u 23:13 - pre 204 meseci
Citat:
mmix: Ne mozes ovako. Jedina SQL komanda koja tebi moze da odradi ovaj posao je:

Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID IN ('10249', 'itd', 'itd', 'koliko', 'hoces', 'elemenata')
GROUP BY ProductID



Hvala puno, to je ta komanda, to mi je trebalo, ali gresim u kodu u aplikaciji. Ako zelim da iz neke kontrole odaberem ProductID za koje zelim da vrsim pretragu, izvrsavam proceduru za toliko puta koliko postoji ProductID. Probao sam da napunim listBox kontrolu sa zeljenim ProductIDp-ijevima i da za svaki ProductID pozivam proceduru, ali tako ne valja. Ako stavim checkBox u dataGrid, onda opet imam foreach petlju za citanje selektovanih ProductID-ijeva i opet pozivam proceduru vise puta.
Na koji nacin se resava ovakav problem?

Pozdrav,
Vlada
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput23.06.2007. u 23:37 - pre 204 meseci
Mi smo sasvim lepo rešavali prosleđivanje skupa vrednosti stored proceduri kroz prosleđivanje xml-a sa serijalizovanim vrednostima i korišćenje sp_xml_preparedocument u proceduri.

Ovde imaš kompletan primer.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput25.06.2007. u 12:36 - pre 204 meseci
Totalno cool resenje. Na pamet mi nije palo...
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

zelbi

Član broj: 17006
Poruke: 17
*.vtx.ch.



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput29.06.2007. u 21:54 - pre 204 meseci
pozdrav,

ja koristim dva nacina :

1. u proceduru dodam parametar varchar(max) i upotrebljavam funkciju Split (moze se lako naci na internetu) :

Code:

CREATE PROCEDURE dbo.Test
     @ID_Products varchar(max)
AS

select *
from   dbo.Products
where ID_Product in (select convert(int, value) from dbo.Split(@ID_Products, ','))



ID u parametru @ID_Products imaju zarez kao razmak : 1, 2, 3
u SQL 2000, bio sam ogranicen na varchar(8000) u SQL 2005 nema vise toga ogranicenja


2. Drugi trik je dodati kolonu tabeli ID, naprimjer ID_Product2 i ispuniti je na iduci nacin :

Code:

ID_PRODUCT    ID_PRODUCT2
========== ===========
1                         1
2                         2 
3                         4
4                         8 

CREATE PROCEDURE dbo.Test
       @ID_Product2 int
AS

select  *
from    dbo.Products
where  @ID_Product2 & ID_Product2 = ID_Product2



U ovom slucaju parametar @ID_Product2 ti je suma svih ID-a. Ako je izabrat ID_Product 1 i 3, to ti je 1 + 4 = 5 znaci @ID_Product2 = 5
Da ovaj trik radi kako treba nesmijes preci 64 ID_Product-a.

Sto se tice brzine, druga solucija je brza ali ogranicena na 64 proizvoda, dok prva nema ogranicenja.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
195.252.78.*



+311 Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput29.06.2007. u 23:23 - pre 204 meseci
Ako koristis SP i ne gradis upit dinamicki vec prenosis ID-jeve preko jednog parametra pored navedenih moze i ovakvo resenje naprimer:

Code:

SELECT * FROM Products
WHERE CHARINDEX('|' + CAST(ProductID AS varchar(20)) + '|', @ProductIDs, 1) > 0


Gde je @ProductIDs string parametar sa vrednoscu naprimer '|1|2|3|10|'

Jednostavno je i radi brzo za mali broj rekorda, medjutim ako imas puno rekorda
koristi neko drugo resnje koje nece za svaki rekord pozivati CHARINDEX, tj. vec navedeni
primer sa split funkcijom odnosno xml-om

Pozdrav!

 
Odgovor na temu

[es] :: .NET :: Kako stored proceduru sa vise parametara pozvati samo jedanput

[ Pregleda: 3593 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.