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

 

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

Παραμετρικό πέρασμα table σε stored procedure

Îåêßíçóå áðü ôï ìÝëïò georgiop. Τελευταία δημοσίευση από το μέλος Χρήστος Γεωργακόπουλος στις 15-07-2005, 22:49. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-12-2004, 09:37 552

    Παραμετρικό πέρασμα table σε stored procedure

    Υπάρχει τρόπος να γίνει κάτι τέτοιο στον SQL Server?

    CREATE PROCEDURE dbo.generic_table_count 
     @tablename varchar(255)
    AS
     SELECT COUNT(*) FROM @tablename
    GO

    (Το παραπάνω δημιουργεί syntax error.)

  •  01-12-2004, 10:24 553 σε απάντηση της 552

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Πρέπει να χρησιμοποιήσεις την EXEC:

    EXEC ('SELECT COUNT(*) FROM ' + @tablename)


    Patrick
  •  01-12-2004, 19:37 555 σε απάντηση της 552

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Δεν ξέρω αν υπάρχει οποιαδήποτε βάση δεδομένων που να μπορεί να περάσει σαν παράμετρο ένα πίνακα και μετά να τον χρησιμοποιήσει σε SQL statements. Η ίδια η ιδέα του stored procedure έρχεται σε αντίφαση με αυτό. Όταν ένα stored procedure γίνεται compile αποθηκεύεται στη βάση το execution plan για όλα τα statements που περιέχει. Το execution plan του κάθε statement εξαρτάται άμεσα από τους πίνακες που επηρρεάζει. Έτσι δεν είναι δυνατόν να φτιαχτεί execution plan για άγνωστο πίνακα. Σκέψου το σα να περνάς ένα object σαν παράμετρο σε ένα C# method και μετά να προσπαθείς να καλέσεις μεθόδους του ICollection επάνω του.

    Αν θέλεις οπωσδήποτε να πάρεις το count μέσα από ένα stored procedure, θα πρέπει να χρησιμοποιήσεις το EXEC όπως είπε και ο Patrick. Αυτή η λύση όμως είναι ισοδύναμη με το να γράψεις το Select κατευθείαν μέσα στον κώδικά σου χωρίς να καλέσεις το stored procedure. Αυτή η λύση είναι καλή αν θες το count σε λίγα σημεία.

    Αν τώρα θες να χρησιμοποιήσεις πολλούς πίνακες ή αν το count χρησιμοποιείται συχνά, θα μπορούσες να χρησιμοποιήσεις ένα code generator για να δημιουργήσεις ένα stored procedure για κάθε πίνακα.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-12-2004, 08:29 562 σε απάντηση της 555

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Νομίζω με καλύψατε πλήρως, ευχαριστώ!

  •  14-07-2005, 15:10 3464 σε απάντηση της 552

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Μπορείς να δοκιμάσεις και την sp_executesql.....
  •  14-07-2005, 15:19 3466 σε απάντηση της 3464

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Φτού φτου φτου! Ξού ξου ξου! Εδώ συζητάμε πως να αποφύγουμε το χύμα SQL! Είτε με exec, είτε με sp_executesql είναι το ίδιο σα να έφτιαχνες το statement στον client και να το έτρεχες κατευθείαν πάνω στους πίνακες.

    Όπως και να το κοιτάξεις, όταν αρχίζεις να ψάχνεις πως να περάσεις το όνομα του πίνακα σε ένα stored procedure κάτι πάει άσχημα, πολύ άσχημα, μα ΠΑΡΑ πολύ άσχημα με τη σχεδίαση της βάσης σου!

    Παράδειγμα: Στο navision κάποιοι πίνακες έχουν πρόθεμα το ... όνομα της βάσης! Έτσι δεν μπορείς να φτιάξεις ένα stored procedure και να το χρησιμοποιήσεις σε διαφορετικά installations, παρότι δεν έχει αλλάξει τίποτα εκτός από ... το όνομα του πίνακα! [+o(]
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-07-2005, 17:56 3470 σε απάντηση της 3466

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Όλοι κάνουμε πράγματα που δε μας αρέσουν. Βιαστικές αποφάσεις, το θέλω και το θέλω χτες κτλ. Σίγουρα όμως μερικές φορές τα παραμετρικά ονόματα πινάκων βολεύουν, και μάλιστα βολεύουν πολύ!

    Παρ' όλα αυτά, η MS λέει ότι η χρήση της sp_executesql είναι προτιμότερη από την exec, επειδή execution plan μπλα μπλα, optimizer μπλα μπλα και αν πω ότι τα κατάλαβα όλα, ψέματα θα πω. Αν κάποιος μπορούσε να εξηγήσει ακριβώς πως δουλεύει ο optimiser σε αυτές τις περιπτώσεις.......
  •  14-07-2005, 18:46 3473 σε απάντηση της 3470

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Καλύτερη πιθανότητα επαναχρησιμοποίησης του execution plan (που το διατηρεί, μήπως και ξανακάτσει - κονώς, gets cachedSmile)

    Άρης


    Aris
  •  15-07-2005, 09:45 3484 σε απάντηση της 3473

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Αν περάσεις το όνομα του πίνακα δεν θα γίνει τίποτα cached. Το cached plan περιέχει πληροφορία πως να γίνει η αναζήτηση σε συγκεκριμμένους πίνακες. Αν τους αλλάξεις, είναι άχρηστο και το statement ξαναγίνεται compile. Δεν έχει σημασία αν θα χρησιμοποιήσεις την EXEC ή την sp_executesql, caching δεν θα παίξει.
    Και να μην ξεχνάμε, ότι θα πρέπει να δώσεις permissions στον τελικό χρήστη κατευθείαν πάνω στους πίνακες [:-*] για να δουλέψουν και τα δύο.

    Η χύμα SQL είναι σχεδόν πάντα δείγμα ότι δεν έχει σχεδιαστεί σωστά η βάση και ότι κάπου κρύβονται και πολλά άλλα προβλήματα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-07-2005, 12:58 3493 σε απάντηση της 3484

    Re: Παραμετρικό πέρασμα table σε stored procedure

    Είμαστε χαμένοι απο χέρι δηλαδή ε; Σε περίπτωση που η κλήση γίνει με το ίδιο όνομα πίνακα (ίδια τιμή στην παράμετρο δηλαδή), πάλι θα γίνει recompile το statement; Τα keep plan ή with no recompile κάνουν καμία διαφορά σε αυτές τις περιπτώσεις;
  •  15-07-2005, 22:49 3509 σε απάντηση της 3484

    Re: Παραμετρικό πέρασμα table σε stored procedure

     pkanavos wrote:

    Η χύμα SQL είναι σχεδόν πάντα δείγμα ότι δεν έχει σχεδιαστεί σωστά η βάση...



    Βρε, ξου... με έθιξες τώρα.... Stick out tongue
    Χρήστος Γεωργακόπουλος
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems