Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Functions Vs Stored Procedures

Îåêßíçóå áðü ôï ìÝëïò JohnieG. Τελευταία δημοσίευση από το μέλος cap στις 09-03-2006, 17:27. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-03-2006, 12:04 10464

    Functions Vs Stored Procedures

    Καλημέρα,

       Έχω μπει στη διαδικασία μεταφοράς ενός project από MS Access σε SQL Server 2005 οπότε μου γεννήθηκε ο προβληματισμός τα ήδη υπάρχοντα queries μου σε τι να τα μετατρέψω (???) . Απο τα λίγα που διάβασα δεν μπόρεσα να λάβω μια σαφή εικόνα για μια ενδεδειγμένη τακτική καθώς τα περισσότερα άρθρα κατέληγαν στο ότι σε κάθε περίπτωση καλό είναι να δοκιμάζεις και τις δύο μεθόδους και να διαπιστώνεις ποια σε εξυπηρετεί καλύτερα.

      Αυτό που θα ήθελα να ζητήσω είναι μια δεύτερη άποψη επί του θέματος καθώς κι ενδεχόμενα άρθρα ή πηγές που θα μπορούσαν ίσως να με διαφωτίσουν περισσότερο. Επίσης φαντάζομαι πως μια καλή εναλλακτική θα ήταν η μετατροπή των queries σε views απλά εγω θα ήθελα να επικεντρώσω στις διαφορές μεταξύ Functions και Stored Procedures.

      Κάθε πληροφόρηση είναι ευπρόσδεκτη. Ευχαριστώ εκ των προτέρων....


    Always Look On The Bright Side Of Life...
  •  09-03-2006, 12:49 10503 σε απάντηση της 10464

    Απ: Functions Vs Stored Procedures

    Καταρχήν καλωσήλθες!

    Τα queries της Access γενικά μπορούν να χρησιμοποιηθούν για δύο λόγους:

    - Ανάκτηση δεδομένων
    - Εισαγωγή, τροποποίηση ή διαγραφή δεδομένων.

    Στην περίπτωση της ανάκτησης, ο πιό σωστός τρόπος είναι να τα μετατρέψεις σε views. Βεβαια, αν τα queries έχουν κάποιο είδος "λογικής" (π.χ. βάσει μιας παραμέτρου φέρνουν αυτό ή εκείνο το result set), τότε θα ήταν ιδανικό να μετατραπούν σε stored procedures.

    Στις υπόλοιπες περιπτώσεις, αναμφισβήτητα οι stored procedures αποτελούν το αντίστοιχο των delete, update, insert queries της Access.

    Οσον αφορά στα functions τωρα: Τα user-defined functions ή UDFs εμφανίστηκαν στον SQL Server 2000 και ουσιαστικά μπορούν να ψιλοκάνουν αρκετά πράγματα από αυτά που κάνουν και οι stored procedures (εξ'ου και η σύγχυση η οποία δικολογημένα υφίσταται στο μυαλό σου).

    Από την άλλη μεριά, ο σκοπός των UDFs δεν είναι να αντικαταστήσουν τα stored procedures, αλλά να τα απλοποιήσουν. Μια UDF μπορεί να χρησιμοποιηθεί για να κάνει περίπλοκους υπολογισμούς με βάση κάποιες αρχικές τιμές και να επιστρέφει δύο πράγματα: Ειτε μια τιμή (σε κάποιο από τα γνωστά data types του SQL Server), ειτε ένα ολόκληρο in-memory table (οι λεγόμενες table-valued functions που επιστρέφουν τις λεγόμενες table variables) το οποίο μπορεί να χρησιμοποιηθεί σε joins κλπ. όπως οποιοδήποτε άλλο table, με τη διαφορά οτι εφόσον είναι στη μνήμη είναι σαφώς πίο γρήγορη οποιαδήποτε ενέργεια σε αυτό.

    Οι UDFs που επιστρέφουν μια συγκεκριμένη τιμή μπορούν να χρησιμοποιηθούν INLINE σε κάποιο SQL statement και εκεί έγκειται και η μεγάλη τους χρησιμότητα. Π.χ. δες το εξής (φανταστικό) παράδειγμα:

    SELECT customer.id, customer.name, dbo.udfGetYearsToPension(customer.age) from customer

    H dbo.udfGetYearsToPension δέχεται μια παράμετρο (λογικά, έναν αριθμό) και υπολογίζει τα χρονια που απομένουν μέχρι τη συνταξιοδότηση του πελάτη. Εσύ κάνεις ένα απλό select χρησιμοποιώντας τη UDF και παίρνεις το νουμεράκι. Αυτή, στο παρασκήνιο, μπορεί να κάνει select απο 10 πίνακες ακόμα και να κοιτάει σε ποιά κατηγορια επαγγέλματος βρισκεται ο πελάτης, πόσα ένσημα έχει, τι αλλες παράμετροι συντρέχουν που μπορεί να οδηγούν σε πιό πρόωρη συνταξιοδότηση, να συνυπολογίζει την ηλικία (η οποία περνάει στη UDF ως όρισμα ΓΙΑ ΚΑΘΕ γραμμή η οποία γίνεται select) και να σου δίνει το τελικό νουμεράκι. Ειναι προφανές οτι δεν μιλαμε απλά για μια calculated τιμή.

    Αν επιχειρούσες να το κάνεις αυτό με stored procedure, μπορεί να το πετύχαινες, αλλά θα ήταν πολύ πιό περίπλοκο. Από την άλλη μεριά μπορείς να φτιάξεις μια stored procedure που να χρησιμοποιεί αυτή τη UDF.

    Αυτή ειναι μόνο μια μικρή εισαγωγή - παράδειγμα. Γενικώς οι UDF επιτελούν βοηθητικό και όχι πρωταρχικό ρόλο, όπως οι stored procedures. Αν χρειάζεσαι περισσότερες πληροφορίες, εδώ είμαστε!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  09-03-2006, 16:53 10513 σε απάντηση της 10464

    Απ: Functions Vs Stored Procedures

    Ευχαριστώ για την γρήγορη και κατατοπιστική απάντηση!Δυστυχώς όμως μου γεννήθηκε ακόμη ένα ερώτημα...

    Το παράδειγμα με την UDF στο select clause είναι κατανοητό. Πέρα από αυτό όμως έχω τη δυνατότητα να χρησιμοποιήσω μια table-valued UDF με ανάλογο τρόπο σε ένα from clause δεδομένου ότι, αν κατάλαβα καλά, θα μου επιστρέψει δεδομένα σε μορφή πίνακα; 'Η απλά είναι εντελώς διαφορετικό πράγμα μια table-valued function από έναν πίνακα;

    Ζητώ προκαταβολικά συγγνώμη αν η ερώτηση μου είναι λιγάκι "άστοχη"...
    Always Look On The Bright Side Of Life...
  •  09-03-2006, 17:27 10515 σε απάντηση της 10513

    Απ: Functions Vs Stored Procedures

    Δεν είναι καθόλου άστοχη η ερώτηση σου. Η απάντηση είναι οτι φυσικά και μπορείς να τη χρησιμοποιήσεις με ένα τέτοιο τρόπο. Στα books online του SQL Server 2000 υπάρχει ένα σχετικό παράδειγμα το οποίο και αντιγράφω εδω:

     

    In a user-defined function that returns a table:

    The RETURNS clause defines a local return variable name for the table returned by the function. The RETURNS clause also defines the format of the table. The scope of the local return variable name is local within the function.

    The Transact-SQL statements in the function body build and insert rows into the return variable defined by the RETURNS clause.

    When a RETURN statement is executed, the rows inserted into the variable are returned as the tabular output of the function. The RETURN statement cannot have an argument.
    No Transact-SQL statements in a function that returns a table can return a result set directly to a user. The only information the function can return to the user is the table returned by the function.

    This example creates a function in the Northwind database that returns a table:

    CREATE FUNCTION LargeOrderShippers ( @FreightParm money )
    RETURNS @OrderShipperTab TABLE
       (
        ShipperID     int,
        ShipperName   nvarchar(80),
        OrderID       int,
        ShippedDate   datetime,
        Freight       money
       )
    AS
    BEGIN
       INSERT @OrderShipperTab
            SELECT S.ShipperID, S.CompanyName,
                   O.OrderID, O.ShippedDate, O.Freight
            FROM Shippers AS S INNER JOIN Orders AS O
                  ON S.ShipperID = O.ShipVia
            WHERE O.Freight > @FreightParm
       RETURN
    END

    In this function, the local return variable name is @OrderShipperTab. Statements in the function body insert rows into the variable @OrderShipperTab to build the table result returned by the function.

    This query references the table returned by the function in its FROM clause:

    SELECT *
    FROM LargeOrderShippers( $500 )

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems