Τί εννοείς? Δεν υπάρχει τίποτε το ιδιαίτερο στη χρήση table fields σε ένα stored procedure. Μήπως εννοείς να περάσεις το όνομα ενός table field σαν παράμετρο, για να κάνεις "δυναμικό" query? Αν εννοείς αυτό, έχει ξανασυζητηθεί αν και πριν από πάρα πολύ καιρό. Σαν ιδέα δεν είναι και τόσο καλή. Τα κύρια οφέλη ενός stored procedure είναι δύο:
1) Κρύβει τις λεπτομέρειες της βάσης από τον κώδικα. Έτσι μπορεί ο DB administrator ή ο σχεδιαστής της βάσης να αλλάξει πίνακες, πεδία κλπ. ανάλογα με τις ανάγκες της βάσης χωρίς να "σκάσει" η εφαρμογή.
2) Εκτελείται πιο γρήγορα γιατί ο SQL Server δημιουργεί ένα execution plan την πρώτη φορά που θα εκτελεστεί ένα stored procedure και το ξαναχρησιμοποιεί κάθε φορά που καλείται αυτό. Το execution plan είναι μία αλληλουχία ενεργειών όπως αναζήτηση βάση του Χ index, aggregation αυτών των δεδομένων κλπ, το οποίο εξαρτάται από τα πεδία που συμμετέχουν σε ένα query, τα indexes που υπάρχουν, την κατανομή των δεδομένων κλπ.
Με αυτό που σκέφτεσαι χάνεις και τα δύο πλεονεκτήματα. Καταρχήν, ο κώδικας σου θα πρέπει να ξέρει ποιά είναι τα πεδία της βάσης για να τα περάσει στο stored procedure. Επιπλέον, το execution plan που θα εκτελεστεί για ένα σετ από πεδία μπορεί να είναι εντελώς ακατάλληλο για ένα άλλο σετ από πεδία.
Συνήθως, ο λόγος που θέλει κάποιος να περάσει το όνομα του πεδίου ή ακόμα και του πίνακα σε ένα stored procedure είναι επειδή θέλει να φτιάξει queries για ad-hoc αναζητήσεις, όπου ο τελικός χρήστης επιλέγει τα χαρακτηριστικά που θέλει να ψάξει και τις αντίστοιχες τιμές. Σε αυτές τις περιπτώσεις είναι καλύτερο να φτιάξεις ένα parameterized query (ποτέ χύμα dynamic sql!) και να το εκτελέσεις απευθείας στη βάση. O SQL Server θα κρατήσει το execution plan του parameterized query στην cache και θα το ξαναχρησιμοποιήσει όταν κάποιος άλλος χρήστης κάνει ένα παρόμοιο query. Το μειονέκτημα είναι ότι αν αλλάξει το σχήμα της βάσης σου θα πρέπει να αλλάξει και ο κώδικας.
Αν θέλεις να κρύψεις τις λεπτομέρειες της βάσης από τον κώδικα, μπορείς να φτιάξεις το string του parameterized query σε ένα stored procedure και να το εκτελέσεις με την sp_executesql. Το πρόβλημα εδώ είναι ότι η T-SQL δεν είναι και η καλύτερη γλώσσα για string manipulation. Θα χρειαστεί να γράψεις αρκετά περισσότερο κώδικα για να κάνεις ό,τι θα έκανες ίσως με μία String.Format στον client.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos