none
Trasformare una vista in funzione. RRS feed

  • 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.PresidioID

    in 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.PresidioID

    dove 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

    lunedì 2 aprile 2012 17:25

Risposte

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:

    1. 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;
    2. 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;
    3. 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

    lunedì 2 aprile 2012 19:02
    Moderatore
  • 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.PresidioID

    Il problema più grosso è che non sono in grado di trasformarla in UDF.

    Grazie e ciao

    Giovanni

    martedì 3 aprile 2012 07:48
  • 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, PresidioID

    Mi 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

    martedì 3 aprile 2012 13:18
  • 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.PresidioID

    TAPrestazioniErogatori.PresidioID = udf_SelTA.PresidioID

    Attendo conferme sulla correttezza del codice.

    Grazie e ciaoGiovanni

    martedì 3 aprile 2012 14:33
  • 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

    martedì 3 aprile 2012 14:46
    Moderatore
  • OK.

    Grazie e ciao

    Giovanni

    martedì 3 aprile 2012 16:50