有什么办法如何做到这一点? 这不起作用:
SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; ");
prikaz.Parameters.AddWithValue("name", name);
prikaz.Parameters.AddWithValue("slot", slot);
我能想到的唯一的事情就是用SP和申报,并设置变量列。 在我看来,有点ackward。
有什么办法如何做到这一点? 这不起作用:
SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; ");
prikaz.Parameters.AddWithValue("name", name);
prikaz.Parameters.AddWithValue("slot", slot);
我能想到的唯一的事情就是用SP和申报,并设置变量列。 在我看来,有点ackward。
你不能在普通的SQL做到这一点 - 如果你必须有可配置的列名(或表名,对于这个问题),你必须使用动态SQL - 有没有其他的方式来实现这一目标。
string sqlCommandStatement =
string.Format("SELECT {0} FROM dbo.Users WHERE name=@name", "slot");
然后使用sp_executesql
存储过程在SQL Server来执行SQL命令(和根据需要指定其他参数)。
动态SQL都有其优点和缺点-阅读的终极文章的诅咒和动态SQL祝福由SQL Server MVP厄兰Sommarskog熟练地写。
正如已经提到的,你不能参数化的基本查询,所以你必须建立在运行时查询本身。 你应该白名单的这个输入,以防止注入攻击,但从根本:
// TODO: verify that "slot" is an approved/expected value
SqlCommand command = new SqlCommand("SELECT [" + slot +
"] FROM Users WHERE name=@name; ")
prikaz.Parameters.AddWithValue("name", name);
这样@name
仍然是参数化等。