Измените ваш SQL на (в вашем коде):
string sqlToExecute = "EXEC ('SELECT * from foo WHERE ' + @nameofdbcolumnprovidedbyparam + ' =1')";
Теперь Sql Server выполнит ваш запрос и подставит этот параметр в SQL, поэтому, если вы передадите его как «Столбец1», фактическое выполнение Sql будет:
"EXEC('SELECT * from foo WHERE Column1 =1')";
Бит "EXEC ('')" позволяет Sql выполнять фрагмент динамически сконструированного Sql
Это не идеально, так как оставляет вас более уязвимыми для атак Sql Injection, которые не годятся , поэтому было бы лучше, если бы вы могли создать Sql для выполнения, ограничивая количество выбираемых столбцов в контролируемый список и переключение выполняемого оператора в зависимости от этого. Если это невозможно, тогда другим решением будет использование хранимой процедуры, которая принимает параметры, допускающие значение NULL, например:
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
При вызове этой процедуры и передаче значения NULL для столбцов, которые вас не интересуют, будут возвращены только записи из таблицы "foo", которые соответствуют столбцу, за которым вы следите.