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: 841 | Odgovora: 7 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bigtime
Vladimir Dimitrijevic
Beograd

Član broj: 32587
Poruke: 119
91.150.84.*



Profil

icon Kako stored proceduru sa vise parametara pozvati samo jedanput17.06.2007. u 08:02
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
17.06.2007. u 08:02 

majstor_01

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



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput18.06.2007. u 00:31
Daj dizajn tabele orders...
18.06.2007. u 00:31 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 1966
*.maxre.bm.

Sajt: blog.mitrovic.rs


Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput18.06.2007. u 15:25
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.
▪ "Why isn't my wireless mouse connected to the computer?" - 2008 Dumbest Technical Support Question
▪ The word 'politics' is derived from the word 'poly', meaning 'many', and the word 'ticks', meaning 'blood sucking parasites' - Hardiman
▪ If the good guy gets the girl, it's rated PG; if the bad guy gets the girl, it's rated R; and if everybody gets the girl, it's rated X



18.06.2007. u 15:25 

bigtime
Vladimir Dimitrijevic
Beograd

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



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput23.06.2007. u 23:13
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
23.06.2007. u 23:13 

jablan
Mladen Jablanović
Beograd

Član broj: 8286
Poruke: 3136
*.net.upc.cz.

Sajt: blog.radioni.ca


Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput23.06.2007. u 23:37
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.
23.06.2007. u 23:37 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 1966
*.maxre.bm.

Sajt: blog.mitrovic.rs


Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput25.06.2007. u 12:36
Totalno cool resenje. Na pamet mi nije palo...
▪ "Why isn't my wireless mouse connected to the computer?" - 2008 Dumbest Technical Support Question
▪ The word 'politics' is derived from the word 'poly', meaning 'many', and the word 'ticks', meaning 'blood sucking parasites' - Hardiman
▪ If the good guy gets the girl, it's rated PG; if the bad guy gets the girl, it's rated R; and if everybody gets the girl, it's rated X



25.06.2007. u 12:36 

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
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.
29.06.2007. u 21:54 

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 234
195.252.78.*



Profil

icon Re: Kako stored proceduru sa vise parametara pozvati samo jedanput29.06.2007. u 23:23
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!

29.06.2007. u 23:23 

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

[ Pregleda: 841 | Odgovora: 7 ]

Postavi temu Odgovori

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