Odinare una vista

lunedì 30 marzo 2009 - 14.49

sanzo77 Profilo | Newbie

Devo elaborare due tabelle riguardanti ordini, una contiene le testate degli ordini e l'altra le righe. Ho bisogno di creare una vista che sia ordinata in maniera tale che per ogni ordine sia elencata prima la testata e poi le relative righe, poi un altra testata con le relative righe e così via. Ho strutturato le 2 tabelle in modo tale che abbiano gli stessi campi, ovvero: numeroordine, tiporecord (testata/riga), contenutorecord (un tracciato che contiene diverse informazioni in formato testo). L'idea è quello di procedere per selezione sulla prima e sulla seconda tabella per poi accorpare il tutto tramite union e infine ordinare tramite order by numeroordine, tiporecord.
Il tutto dovrebbe essere una vista perchè così sarebbe sempre disponibile ed aggiornata. Il problema è che SQL Server non ordina le viste.
Ho provato un controverso escamotage che consiglia di creare la vista tramite una select top 100 percent, in questo modo il create view accetta l'order by. Tale escamotage sembrerebbe funzionare perchè non da errore, ma nel momento in cui si fa la select da quella tabella il risultato viene fuori non ordinato (o almeno non come voglio io).
Avete consigli che non prevedano la scrittura di una tabella temporanea da sblankare ogni volta?
Grazie :-)

alx_81 Profilo | Guru

>Devo elaborare due tabelle riguardanti ordini, una contiene le
>testate degli ordini e l'altra le righe. Ho bisogno di creare
>una vista che sia ordinata in maniera tale che per ogni ordine
>sia elencata prima la testata e poi le relative righe, poi un
>altra testata con le relative righe e così via. Ho strutturato
>le 2 tabelle in modo tale che abbiano gli stessi campi, ovvero:
>numeroordine, tiporecord (testata/riga), contenutorecord (un
>tracciato che contiene diverse informazioni in formato testo).
>L'idea è quello di procedere per selezione sulla prima e sulla
>seconda tabella per poi accorpare il tutto tramite union e infine
>ordinare tramite order by numeroordine, tiporecord.
>Il tutto dovrebbe essere una vista perchè così sarebbe sempre
>disponibile ed aggiornata. Il problema è che SQL Server non ordina
>le viste.
>Ho provato un controverso escamotage che consiglia di creare
>la vista tramite una select top 100 percent, in questo modo il
>create view accetta l'order by. Tale escamotage sembrerebbe funzionare
>perchè non da errore, ma nel momento in cui si fa la select da
>quella tabella il risultato viene fuori non ordinato (o almeno
>non come voglio io).
>Avete consigli che non prevedano la scrittura di una tabella
>temporanea da sblankare ogni volta?
Sì, farti una stored procedure in cui fai una select sulla vista, ordinandola con l'order by esternamente

>Grazie :-)
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Il tutto dovrebbe essere una vista perchè così sarebbe sempre
>disponibile ed aggiornata. Il problema è che SQL Server non ordina
>le viste.
>Ho provato un controverso escamotage che consiglia di creare
>la vista tramite una select top 100 percent, in questo modo il
>create view accetta l'order by. Tale escamotage sembrerebbe funzionare
>perchè non da errore, ma nel momento in cui si fa la select da
>quella tabella il risultato viene fuori non ordinato (o almeno
>non come voglio io).

Ciao,

Gli escamotage non costituiscono mai una "bella" soluzione, soprattutto quando non funzionano
Il motivo del mancato funzionamento è molto semplice: lo standard ANSI SQL non ammette la clausola ORDER BY nel corpo di una vista, dato che per definizione una vista restituisce un table set, mentre una clausola di ordinamento restituirebbe un cursore.
A partire dalla versione 2005 SQL Server ignora eventuali TOP...ORDER BY, rispettando in pieno lo standard ANSI SQL.
La clausola di ordinamento va applicata al comando di SELECT che richiama la vista.

>Grazie :-)
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanzo77 Profilo | Newbie

Il problema è che il programma che utilizza la vista come sorgente dati non è configurabile, quindi non è possibile definire un order by nella select... e le stored procedure non le conosco... mi sa che però non ci siano altre alternative, quindi mi toccherà imparare a usare le SP.
Grazie ancora.

alx_81 Profilo | Guru

>Il problema è che il programma che utilizza la vista come sorgente
>dati non è configurabile, quindi non è possibile definire un
>order by nella select... e le stored procedure non le conosco...
>mi sa che però non ci siano altre alternative, quindi mi toccherà
>imparare a usare le SP.
Molto semplice:
CREATE PROCEDURE <schema>.<nomeproc> AS BEGIN SET NOCOUNT ON; SELECT <campi> FROM <schema>.<nomevista> [Eventuale WHERE] ORDER BY <campi> END

Poi dipende da dove la devi richiamare.
Sappi che puoi lanciare una stored procedure con SQL:

EXEC <schema>.<nomeproc> [Eventuale elenco parametri]

>Grazie ancora.
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

sanzo77 Profilo | Newbie

Grazie della dritta sulle store procedure, però quello che mi sfugge è : "cosa produce una store procedure?"
Ovvero, io ho bisogno che il risultato della SP che fa la select vada a finire su una tabella... oppure posso creare una vista che richiama una SP? Tipo
CREATE VIEW V1 AS ( EXEC ..... )
E in quel caso la vista sarebbe ordinata?
Visto che probabilmente la risposta alle mie ultime due domande è no... posso realizzare una SP che richiamata periodicamente tramite job faccia la select di cui sopra e inserisca il risultato in una tabella in modop erò che controlli anche l'esistenza dei record da inserire (non devo avere righe doppie).
Scusate eh, ma sta cosa mi sta facendo impazzire. Avevo pensato di risolvere tramite un pacchetto SSIS però anche lì ho problemi per l'esecuzione (qual'è il luogo giusto in questo forum per fare domande su SSIS?? :D )

Grazie come sempre della collaborazione

alx_81 Profilo | Guru

>Grazie della dritta sulle store procedure, però quello che mi
>sfugge è : "cosa produce una store procedure?"
Una stored procedure "fa qualcosa" e valorizza dei parametri di output al massimo.
Poi valorizza un suo @Return_value (parametro) che se vale 0 sta ad indicare che tutto è andato bene.

se tu fai

DECLARE @Ret int SET @Ret = EXEC <schema>.<nomeproc> [params]

@Ret può valere 0 o un valore diverso da 0. Se è diverso da 0 qualcosa è andato storto.

>Ovvero, io ho bisogno che il risultato della SP che fa la select
>vada a finire su una tabella... oppure posso creare una vista
>che richiama una SP? Tipo
>CREATE VIEW V1 AS ( EXEC ..... )
>E in quel caso la vista sarebbe ordinata?
No, da una vista non puoi lanciare una stored procedure. Una vista è una tabella virtuale. E basta

>Scusate eh, ma sta cosa mi sta facendo impazzire. Avevo pensato
>di risolvere tramite un pacchetto SSIS però anche lì ho problemi
>per l'esecuzione (qual'è il luogo giusto in questo forum per
>fare domande su SSIS?? :D )
Facciamo che ci spieghi bene la situazione reale e cerchiamo di darti una soluzione ottimale

>Grazie come sempre della collaborazione
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5