Η διαφόρά μεταξύ του να περάσεις το generated statement σου στο command object και του να εκτελέσεις ένα stored procedure που θα στο δημιουργεί, έγκειται στα εξής:
- Αν το περάσεις στο command object, και ο SQL Server σου βρίσκεται αλλού (οχι στο μηχάνημα που τρέχει το GUI), αυτό συνεπάγεται οτι το statement κάθε φορά θα περνάει μέσα από το δίκτυο για να φτάσει στον προορισμό του. Αυτό, ανάλογα την κατάσταση, μπορεί να σε προβληματίσει από πολύ ως καθόλου (εξαρτάται από τη χρήση, τον όγκο του statement, το είδος της σύνδεσης μεταξύ sql server και μηχανημάτων που έχουν το GUI κλπ.)
- Από την άλλη πλευρά, τα dynamic EXEC statements γίνονται recompile κάθε φορά που τρέχουν (μια και δεν μπορεί να αποθηκευθεί execution plan για αυτά - τα λέω σωστά pkanavos; θα το πάρω το 70-229 καμμια φορά;

). Εκεί, είτε έτσι το κάνεις είτε αλλιώς ούτε κερδίζεις ούτε χάνεις τίποτα, μια και αν το περνάς στο command object θα έχεις (σχεδόν) το ίδιο effect.
Αν ο πρώτος προβληματισμός που ανέφερα δεν σε αγγίζει υπό την έννοια οτι έχει ελάχιστη επίδραση στην απόδοση του συστήματος, τότε κριτήριο πιστεύω οτι είναι η καθαρότητα του κώδικά σου (ένα constructed query εντός του κώδικα απαιτεί recompile και γεμίζει τον κώδικα με strings και άλλα όμορφα, ενώ ένα dynamic statement στη βάση απαιτεί απλά editing μιας stored procedure σε περίπτωση αλλαγών - και πάλι εξαρτάται από το είδος της αλλαγής βέβαια το αν απαιτείται "μόνο" αυτό).
Γενικά εγώ προτιμώ αν έχω δυναμικά WHERE clauses όπως αναφέρεις στο παράδειγμα, να χρησιμοποιώ stored procedures με EXEC statements. Προκύπτει λιγότερος κώδικας στα sources μου και είναι πιό εύκολη η αλλαγή του πράγματος όταν κάτι δεν πάει καλά, συν οτι δεν περνάνε τεράστια statements μέσα από το δίκτυο.
Ισως θα σε βοηθούσε, αν βέβαια έχει σχέση με τη δική σου περίπτωση, ένα αρθράκι που είχα γράψει παλιότερα:
Dynamic SQL Where clauses using conditional operators
Σωτήρης Φιλιππίδης
DotSee Web Services