Могут ли параметры sqlcommand предоставить имена столбцов базы данных? - PullRequest
1 голос
/ 24 февраля 2010

Как это:

select * from foo where @nameofdbcolumnprovidedbyparam = 1 ?

Всякий раз, когда я пытаюсь сделать это с помощью sqldatasource или в ado, я получаю такие ошибки, как:

Синтаксическая ошибка при преобразовании значения nvarchar 'foo' в столбец типа данных int.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2010

Измените ваш 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", которые соответствуют столбцу, за которым вы следите.

0 голосов
/ 24 февраля 2010

Вы можете сделать это с помощью кейса

WHERE ( 
CASE @macolumn 
WHEN 'toto' THEN toto
WHEN 'tutu' THEN tutu
WHEN 'titi' THEN titi
ELSE null END
) = 1

Это немного уродливо, но работает, и вам не нужно выполнять динамический sql.

0 голосов
/ 24 февраля 2010

Я думаю, что в этом случае вам нужно будет генерировать SQL динамически без привязки параметров. Привязка параметров обычно используется для санации ввода данных, а не для настройки структуры запроса.

- редактировать -

эта логика может соответствовать вашим потребностям

SELECT *
FROM Line
WHERE ( @foo = 'monTotal' AND monTotal IS NULL)
    OR (@foo = 'monUnitPrice' AND monUnitPrice IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...