如何通过使用占位符列名值作为SQL参数(How to pass a column name valu

2019-07-31 19:12发布

如何通过列名值使用参数占位符的SQL参数?

我们的目标是有这方面的工作:

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

choice是将存储变量column name

@0column 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+"%");

下面一个:BIG CRASH

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+"%");

下面一个:BIG CRASH

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

救命 !!!!!!!!!!!!!!

Answer 1:

简短的回答是,你不能; 参数仅支持 ,而不是列名

要么你有理查德说依傍直接插入文本(这是否发生在代码或通过使用SQL Server exec()函数),或者使用某种库(如LINQ),可以让您构造查询动态且然后转换到这一个文本表示。

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



Answer 2:

我看你已经尝试过什么,你刚刚离开了明显的:

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+"%");

SQL服务器

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


文章来源: How to pass a column name value as SQL argument using placeholders