У меня есть база данных (SQL Server 2005), в которой я хотел бы создавать представления на лету. В моем коде я создаю оператор CREATE VIEW, но единственный способ заставить его работать - это построить всю строку запроса и запустить ее без кода. Я бы хотел использовать параметры, но это:
SqlCommand cmd = new SqlCommand("CREATE VIEW @name AS SELECT @body");
cmd.Parameters.AddWithValue("@name", "foo");
cmd.Parameters.AddWithValue("@body", "* from bar");
сообщает мне, что есть ошибка «возле ключевого слова VIEW» (предположительно «@name») - само собой разумеется, что "CREATE VIEW foo AS SELECT * FROM bar" работает как чемпион.
Это просто невозможно? Если нет, есть ли лучший способ очистить ввод перед выполнением оператора CREATE? В некоторых случаях в теле запроса мог быть пользовательский ввод, и я чувствовал бы себя в большей безопасности, если бы мог сказать «рассматривать это как тело единственного оператора выбора». Может, то, о чем я прошу, слишком странно?
"This statement will not alter any existing data in any way{ ... }".
Прямо сейчас это кодируется путем конкатенации строк, как в ответе фриоль, но при этом никакой дезинфекции не происходит. Мне было бы лучше, если бы я мог хотя бы очистить его от подозрительных персонажей, например; или - или что у вас. Я надеялся, что может быть функция библиотеки, которая будет очищать за меня, или что-то в этом роде.


Может я не правильно понял, но что мешает сделать:
viewname = "foo";
viewwhere = "* from bar";
SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);
Что ж, вы даете пользователю возможность написать любой запрос. Это определение SQL-инъекции :)
Параметры - это не просто подстановка строк. Вот почему ваш код не будет работать.
Это как ты не можешь
sql = "выберите * из заказов, где orders_id в (?)"
и передайте "1,2,3,5" в качестве параметра.
Параметры проверяются по типу и могут содержать только скалярные значения IIRC.
Мне кажется, что вы пытаетесь создать динамический запрос с использованием параметров, а параметризованный запрос не предназначен для работы. Они не просто объединяются в строку.
Если то, что вы пытаетесь предотвратить, - это SQL-инъекция, я бы сделал проверку, что имя представления содержит только буквенно-цифровые символы и не содержит ключевых слов T-SQL. Я бы также был очень осторожен с динамическим созданием тела.
SQL-инъекция. Вы этого хотите, вот в чем дело. Вы должны объединить этот материал.
Это безопасно? Предотвращает ли это SQL-инъекцию?