Principale utente con più risposte
Trasformare una vista in funzione.

Domanda
-
Un saluto a tutti.
Partendo dal presupposto che le viste non accettano parametri in input, dovrei trasformare questa vista:
SELECT TOP (100) PERCENT dbo.TAPrestazioniErogatori.PresidioID, MIN(dbo.TA.DataAttesa) AS DataAttesa, dbo.TAPrestazioniErogatori.CodMTA
FROM dbo.TA INNER JOIN
dbo.TAPrestazioniAgende ON dbo.TA.AgendaID = dbo.TAPrestazioniAgende.AgendaID RIGHT OUTER JOIN
dbo.TAPrestazioniErogatori ON dbo.TA.CodMTA = dbo.TAPrestazioniErogatori.CodMTA AND dbo.TA.PresidioID = dbo.TAPrestazioniErogatori.PresidioID
GROUP BY dbo.TAPrestazioniErogatori.CodMTA, dbo.TAPrestazioniErogatori.PresidioID, dbo.TA.ClasseID
HAVING (dbo.TA.ClasseID = 'CLASSE B')
ORDER BY dbo.TAPrestazioniErogatori.CodMTA, dbo.TAPrestazioniErogatori.PresidioIDin una funzione da utilizzare in questa stored procedure:
UPDATE TAPrestazioniErogatori
SET DataAttesa = uv_SelTA.DataAttesa
FROM TAPrestazioniErogatori INNER JOIN
uv_SelTA ON TAPrestazioniErogatori.CodMTA = uv_SelTA.CodMTA AND TAPrestazioniErogatori.PresidioID = uv_SelTA.PresidioIDdove uv_SelTA e' la vista di cui sopra.
E' possibile usare la funzione da me definita come utilizzo la vista nella stored procedure?
Se si come procedo?
Grazie e ciao
Giovanni
Risposte
-
Attendo conferme sulla correttezza del codice.
Corretto, vai tranqui ;-)
Ciao!Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit- Contrassegnato come risposta Gavazzi Giovanni martedì 3 aprile 2012 16:50
Tutte le risposte
-
E' possibile usare la funzione da me definita come utilizzo la vista nella stored procedure?
Se si come procedo?
Ciao Giovanni,
Prima di tutto qualche considerazione:
- Il "vecchio trucchetto" di eseguire una SELECT TOP(100) PERCENT...ORDER BY oltre ad essere una inutile forzatura ed assolutamente fuori luogo in una vista, a partire da SQL Server 2005 non garantisce alcun ordinamento, pertanto ti invito a rimuoverlo;
- Per quale motivo utilizzi la clausola HAVING quando non esegui alcun filtro utilizzando una funzione di aggregazione? Sostituendola con una clausola WHERE eseguiresti il filtro prima di applicare la funzione di aggregazione MIN() ottenendo probabilmente prestazioni superiori;
- Quale sarebbe il parametro della UDF? ClasseID? Tenuto conto di quanto esposto nei punti 1 e 2 non vedo alcun problema nel trasformare la vista in una UDF Inline Table-Valued mediante il comando CREATE FUNCTION.
Ciao!
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit -
Ciao Lorenzo.... e grazie per le preziose info.
Poi... tieni presente che in materia sono ancora meno che un principiante, pertanto, porta pazienza :-).
Questa, salvo miglioramenti aggiuntivi che vorrai/vorrete suggerire dovrebbe essere la vista definitiva, con il parametro DataRilevazione, da trasformare in UDF:
SELECT TAPrestazioniErogatori.PresidioID, MIN(TA.DataAttesa) AS DataAttesa, TAPrestazioniErogatori.CodMTA
FROM TA INNER JOIN
TAPrestazioniAgende ON TA.AgendaID = TAPrestazioniAgende.AgendaID RIGHT OUTER JOIN
TAPrestazioniErogatori ON TA.CodMTA = TAPrestazioniErogatori.CodMTA AND TA.PresidioID = TAPrestazioniErogatori.PresidioID
WHERE (TA.ClasseID = 'CLASSE B') AND (TA.DataRilevazione = @DataRil)
GROUP BY TAPrestazioniErogatori.CodMTA, TAPrestazioniErogatori.PresidioID
ORDER BY TAPrestazioniErogatori.CodMTA, TAPrestazioniErogatori.PresidioIDIl problema più grosso è che non sono in grado di trasformarla in UDF.
Grazie e ciao
Giovanni
-
Scusate..... mi correggo rispetto al post precedente.
Ho creato questa UDF:
ALTER FUNCTION [dbo].[udf_SelTA]
(
@DataRil as SmallDateTime
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter references here
SELECT TAPrestazioniErogatori.PresidioID, MIN(TA.DataAttesa) AS DataAttesa, TAPrestazioniErogatori.CodMTA
FROM TA INNER JOIN
TAPrestazioniAgende ON TA.AgendaID = TAPrestazioniAgende.AgendaID RIGHT OUTER JOIN
TAPrestazioniErogatori ON TA.CodMTA = TAPrestazioniErogatori.CodMTA AND TA.PresidioID = TAPrestazioniErogatori.PresidioID
WHERE (TA.ClasseID = 'CLASSE B') AND (TA.DataRilevazione = @DataRil)
GROUP BY TAPrestazioniErogatori.CodMTA, TAPrestazioniErogatori.PresidioID
)Con questa Select.. riesco ad ottenere i risultati voluti:
DECLARE @DataRil SMALLDATETIME
SET @DataRil = '30-03-2012'
SELECT * FROM [ASA].[dbo].[udf_SelTA](@DataRil)
ORDER BY CodMTA, PresidioIDMi rimane l'ultimo passaggio, far eseguire questo codice:
DECLARE @DataRil SMALLDATETIME
SET @DataRil = '30-03-2012'
UPDATE TAPrestazioniErogatori
SET DataAttesa = udf_SelTA.DataAttesa
FROM TAPrestazioniErogatori INNER JOIN
dbo.udf_SelTA() AS udf_SelTA ON TAPrestazioniErogatori.CodMTA = udf_SelTA.CodMTA AND
TAPrestazioniErogatori.PresidioID = udf_SelTA.PresidioID
WHERE (udf_SelTA.DataRilevazione = @DataRil)che però mi da il seguente errore:
Messaggio 216, livello 16, stato 1, riga 6
Parametri non specificati per la funzione 'udf_SelTA'.In che modo passo il parametro alla UDF?
Grazie e ciao
Giovanni
-
Mi ricorreggo, così non da errori e sembra funzionare. Devo fare una attenta verifica sui dati.
DECLARE @DataRil SMALLDATETIME
SET @DataRil = '30-03-2012'
UPDATE TAPrestazioniErogatori
SET DataAttesa = udf_SelTA.DataAttesa
FROM TAPrestazioniErogatori INNER JOIN
dbo.udf_SelTA(@DataRil) AS udf_SelTA ON TAPrestazioniErogatori.CodMTA = udf_SelTA.CodMTA AND
TAPrestazioniErogatori.PresidioID = udf_SelTA.PresidioIDTAPrestazioniErogatori.PresidioID = udf_SelTA.PresidioID
Attendo conferme sulla correttezza del codice.
- Modificato Gavazzi Giovanni martedì 3 aprile 2012 14:34 Errore
-
Attendo conferme sulla correttezza del codice.
Corretto, vai tranqui ;-)
Ciao!Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit- Contrassegnato come risposta Gavazzi Giovanni martedì 3 aprile 2012 16:50
-