在预准备语句参数中使用表列

时间:2014-08-03 08:16:33

标签: sql sql-server jdbc

我的页面有一个下拉列表,允许用户选择任何搜索类别,如标题,说明等。所以我有这个SQL语句:

select * from table where "selected value from dropdown list" = "searchform"

我想把它传递给准备好的声明:

从表中选择*在哪里? =?

由于我的select语句具有相同的形式,只有where子句中的列不同,有没有办法在不为每列手动创建select语句的情况下执行此操作?

1 个答案:

答案 0 :(得分:2)

是的,它被称为动态sql。

DECLARE @sql AS VARCHAR(MAX)
SET @sql = 'select * from table where ' + @column + ' = ''' + @value + ''''
EXEC(@sql)

您必须检查列是否为数字类型。 你应该小心sql注入。我的例子非常简单,所以你必须自己做检查。

例如,使用QUOTENAME会很有用:

DECLARE @sql AS VARCHAR(MAX)
SET @sql = 'select * from table where ' + QUOTENAME(@column) + ' = ''' + @value + ''''
EXEC(@sql)

以上示例仅为TSQL。在您准备好的声明中,我认为您可以拥有以下内容:

PreparedStatement pstmt = con.prepareStatement("
    DECLARE @sql AS VARCHAR(MAX)
    SET @sql = 'select * from table where ' + QUOTENAME(?) + ' = ? '
    EXEC(@sql)
");
pstm.setString(1,columnName);
pstm.setString(2,filterValue);

不幸的是我不熟悉JAVA,所以我没有测试过。我觉得值得一试。

上面的@sql变量将生成如下语句:

select * from table where [columnname] = filtervalue
用括号括起来的

columnname将有助于防止SQL注入。