У меня есть база данных (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? В некоторых случаях тело запроса может иметь пользовательский ввод, и я бы чувствовал себя безопаснее, если бы был какой-то способ сказать «обрабатывать это как тело отдельного оператора select». Может быть, то, что я прошу, слишком странно?
<ч />
ПОСЛЕДУЮЩАЯ 04 ноября:
Хорошо, да, то, что я хочу, похоже на инъекцию SQL, когда вы приступаете к нему, но я хотел бы, по крайней мере, минимизировать (если не полностью удалить) возможность запуска этой команды и удаления таблицы или чего-то еще. Конечно, пользователь, с которым он работает, не имеет прав на удаление каких-либо таблиц, но я думаю, вы поняли идею. Я бы хотел сказать, по сути, "This statement will not alter any existing data in any way{ ... }"
.
То, как это кодируется прямо сейчас, заключается в объединении строк, как в ответе friol , но это вообще не выполняет санитарную обработку. Я бы почувствовал себя лучше, если бы мог хотя бы почистить его для подозрительных персонажей, например; или - или что у тебя. Я надеялся, что может быть библиотечная функция, которая сделает для меня скраб, или что-то в этом роде.