0

我有一个(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的答案那样进行字符串连接,但这根本没有净化。如果我至少可以清除可疑字符,我会感觉更好,例如;或者——或者你有什么。我希望可能有一个库函数来为我做擦洗,或者类似的东西。

4

4 回答 4

4

参数不仅仅是字符串替换。这就是为什么您的代码不起作用的原因。

就像你做不到

sql = "select * from orders where orders_id in (?)"

并将“1,2,3,5”作为参数传递。

参数经过类型检查,只能包含标量值 IIRC。

于 2008-11-03T20:37:03.283 回答
1

也许我没有正确理解它,但是阻止你做的是什么:

viewname="foo";
viewwhere="* from bar";

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);
于 2008-11-03T20:20:27.623 回答
1

SQL注入。你想要它,这就是重点。你应该连接这些东西。

于 2008-11-03T20:44:39.993 回答
0

在我看来,您正在尝试使用参数创建动态查询,这不是参数化查询的工作方式。它们不会简单地连接到字符串中。

如果您要阻止的是 SQL 注入,那么我要做的是验证视图名称是否仅包含字母数字且不包含 T-SQL 关键字。我也会非常小心地动态创建身体。

于 2008-11-03T20:41:51.777 回答