为什么SQL Server中不允许使用表参数?这有什么解决方案吗?
示例:
using (SqlCommand myCommand = new SqlCommand("SELECT * FROM @table WHERE USERNAME=@username AND PASSWORD=HASHBYTES('SHA1',
@password)", myConnection))
{
myCommand.Parameters.AddWithValue("@table", table);
myCommand.Parameters.AddWithValue("@username", user);
myCommand.Parameters.AddWithValue("@password", pass);
myConnection.Open();
SqlDataReader myReader = myCommand.ExecuteReader())
...................
}
感谢。
答案 0 :(得分:3)
你无法对这部分SQL进行参数化。服务器需要知道能够“准备”查询的表的名称,这是在处理参数之前完成的。
您可以动态生成查询,但这可能会导致SQL注入攻击和运行时SQL语法错误。此外,如果服务器可以缓存SQL语句,则可以节省成本 - 如果每个查询都是动态生成的,那么你将会失去它。
答案 1 :(得分:1)
如果你必须传递价值表......
否则,你想做什么?
编辑:我现在知道了。正如其他人所提到的,SQL并不像那样工作。答案 2 :(得分:1)
为什么呢?因为与查看优化和验证时产生的噩梦相比,灵活性的好处很小。
作为旁注,即使已经识别出您将在SQL中获取带引号的字符串,而不仅仅是表名。具有大量验证的动态SQL是实现此目的的唯一真正方法。
答案 3 :(得分:0)
否,您无法将表名作为参数传递。
最好的方法是尝试使用String.Format作为表名。
答案 4 :(得分:0)
我会尝试通过一个例子来说明我的观点:
如果你去买车,你可以“参数化”一些人认为:你可以改变颜色,可能是发动机的一些变化,你可以放MP3或不...,但你不能改变车模型。如果你改变汽车模型,这不是一个参数,这是另一辆汽车。
与sql查询相同,表不是一个参数是句子本身的一部分,同样的命令是(select,update)..所以你不能从@table做@command。如果你改变了表格,那就是另一句话,就像汽车一样。
(这不是技术性的“因为”问题的答案,而是一个概念上的观点,以便更好地理解其他人发布的技术部分)
我的两分钱。