Changez votre SQL (dans votre code):
string sqlToExecute = "EXEC ('SELECT * from foo WHERE ' + @nameofdbcolumnprovidedbyparam + ' =1')";
Maintenant Sql Server exécutera votre requête et le substitut dans le paramètre dans le SQL, donc si vous l'avez passé en tant que "Column1", le Sql réel exécuté serait:
"EXEC('SELECT * from foo WHERE Column1 =1')";
Le « exec (« ») » bits permet Sql d'exécuter un morceau de dynamique construit Sql
Ce n'est pas idéal car il vous rend plus vulnérables aux attaques par injection SQL qui sont pas bon, donc ce serait mieux si vous pouviez construire le Sql à exécuter en limitant le nombre de colonnes sélectionnables à une liste contrôlée et en basculant l'instruction en cours d'exécution en fonction de cela. Si ce n'est pas possible, alors l'autre solution serait d'utiliser une procédure stockée qui prend des paramètres nullables, tels que:
CREATE PROCEDURE dbo.MyProc
@param1 VARCHAR(10),
@param2 VARCHAR(10)
@param3 VARCHAR(10)
AS
BEGIN
SELECT *
FROM dbo.foo
WHERE ISNULL(@param1, column1) = column1
AND ISNULL(@param2, column2) = column2
AND ISNULL(@param3, column3) = column3
END
En appelant cette procédure et en passant NULL pour les colonnes que vous ne se soucient pas, seulement les enregistrements de la table "foo" qui correspondent à la colonne que vous recherchez seront retournés.
Je pense que vous pourriez être confus entre passer des paramètres à SQL et contraindre dynamiquement votre SQL? – Kane
insérez-vous ou sélectionnez-vous un enregistrement? –
@asad le select est assez explicite. –