我有一个(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 语句的正文”,我会感觉更安全。也许我的要求太奇怪了?
跟进 11 月 4 日:好的,是的,我想要的有点像 SQL 注入,但我想至少最小化(如果不是完全删除)运行此命令并删除表或其他东西的选项. 当然,正在运行的用户首先没有删除任何表的权限,但我想你明白了。我很想有一种说法,实际上,
"This statement will not alter any existing data in any way{ ... }"
。
它现在的编码方式是像friol的答案那样进行字符串连接,但这根本没有净化。如果我至少可以清除可疑字符,我会感觉更好,例如;或者——或者你有什么。我希望可能有一个库函数来为我做擦洗,或者类似的东西。