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

下一个: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+"%");

帮助 !!!!!!!!!!!!!!

4

2 回答 2

2

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

您要么必须像 Richard 所说的那样依赖直接文本插入(无论是在代码中还是通过使用 SQL Server exec() 函数),或者使用某种库(如 LINQ)来构造查询动态,然后将其转换为文本表示。

如果您采用直接文本插入路线,请确保您不允许插入直接用户输入;自己做一些翻译来避免 SQL 注入攻击。

于 2012-09-22T14:35:01.447 回答
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+"%");

SQL 服务器

var sql = "SELECT * FROM Condos WHERE [" + choice + "] LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");
于 2012-09-21T21:46:04.137 回答