如何使用占位符传递列名值作为SQL参数

2 人关注

如何使用参数占位符将一个列名值作为SQL参数传递?

目标是让这个东西发挥作用。

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

choice是一个变量,它将存储column name

@0是一个column name(我没有成功地把它作为一个参数来传递)。

@1是一个search string(而且我对它没有意见)

已经阅读并尝试了很多东西。

下面一个没有抛出任何错误,但没有带来任何数据

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

下面一个抛出Column name not valid = '@0'

var sql = "SELECT * FROM Condos WHERE [@0] LIKE @1"
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

下面一个抛出Column name not valid = 'choice'

var sql "SELECT * FROM Condos WHERE choice LIKE @0");
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个抛出的Must declare scalar variable "@choice"

var sql "SELECT * FROM Condos WHERE @choice LIKE @0");
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个没有抛出任何错误,但没有带来任何数据

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个没有抛出任何错误,但没有带来任何数据

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个没有抛出任何错误,但没有带来任何数据

var sql = "SELECT * FROM Condos WHERE '"+choice+"' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个。巨大的碰撞

var sql = "SELECT * FROM Condos WHERE '"+@choice+"' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个抛出Column name not valid = 'NameShort'

这正是正确的列名

var sql = "SELECT * FROM Condos WHERE ['"+choice+"'] LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

下面一个。巨大的碰撞

var sql = "SELECT * FROM Condos WHERE ['"+@choice+"'] LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

HELP !!!!!!!!!!!!!!

2 个评论
你用的是什么数据库? sql server,mysql,oracle?
WebMatrix中的SQL Server 2008 Express
sql
sql-server
sql-server-2008
placeholder
user1455103
user1455103
发布于 2012-09-22
2 个回答
technophile
technophile
发布于 2012-09-22
已采纳
0 人赞同

简短的回答是,你不能这样做;参数只支持 ,不支持 列名

你要么像Richard所说的那样直接插入文本(不管是在代码中还是通过使用SQL Server exec()函数),要么使用某种库(如LINQ),让你动态地构建查询,然后将其转换为文本表示。

如果你走直接插入文本的路线, 要非常确定你不允许直接插入用户的输入;自己做一些翻译 以避免SQL注入攻击。

谢谢。你说的 "自己做一些翻译 "是什么意思?
我的意思是,你需要做一些事情,比如检查列名是否与有效的列名完全匹配,而不是只是盲目地做 "where " + column + " = 'foo'"。一个switch语句,一个if块,构造一个Expression,以确保该列是表的有效列名,而不是一个潜在的危险值。
RichardTheKiwi
RichardTheKiwi
发布于 2012-09-22
0 人赞同

我在看你试过的东西,你只是漏掉了一个明显的问题。

var sql = "SELECT * FROM Condos WHERE " + choice + " LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

你需要转义列名的唯一原因是当它是一个保留字,如Order。 在这种情况下,你将需要使用数据库特定的标识符转义字符。

例如,MySQL。

var sql = "SELECT * FROM Condos WHERE `" + choice + "` LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");