在sql where子句中使用case语句作为列名的参数

时间:2017-09-12 18:02:52

标签: asp.net sql-server vb.net tsql

我一整天都在寻找适合我情况的解决方案。我找到了一些非常相似的东西但是对我的情况不起作用,我试过了。

这是场景;我有两个桌子底座和partdetails。我有一个asp网站(仅限内部),它有下拉列表,用于选择填充数据网格视图的SQL查询的参数。

我的问题是,我需要能够根据页面上的下拉列表框分配要搜索的条件的列名。

这是我想要定义的查询:(这个返回0行)

sqlCmd.CommandText = ("Select ba.referenceid, ba.partnum, pd.width, pd.length, CONVERT(varchar(12), pd.dateentered, 101) As [dateentered], ba.partqty, ba.status, ba.material From tbl_dlbase ba Join tbl_partdetails pd On ba.referenceid = pd.referenceid Where Case @field1 When 'part #' Then 'ba.partnum' When 'Spacing' Then 'pd.spacing' When 'Surface' Then 'pd.surface' When 'Height' Then 'pd.height' When 'Thickness' Then 'pd.thickness' End Like '%' + @criteria1 + '%'")

sqlCmd.Parameters.AddWithValue("@field1", ddlSc1.SelectedItem.Text)
sqlCmd.Parameters.AddWithValue("@criteria1", txbCriteria1.Text)

这是我尝试过的最新版本的SQL语句。我需要能够根据asp页面上的下拉列表ddlsc1中的选择设置字段/列名称。

我也一直在Studio管理器中尝试查询,看看我是否有胖手指,但它也返回0行,所以我知道查询有问题。

那么如何使用名称参数设置列名字段。我知道这是SQL注入的一个巨大的安全问题,但这是一个内部唯一的站点,更重要的是我的老板说他希望它完成变量。

1 个答案:

答案 0 :(得分:2)

除了你的THEN值附近有单引号外,我真的没有看到这个问题。这样可以解决吗?

SELECT ba.referenceid
    ,ba.partnum
    ,pd.width
    ,pd.length
    ,CONVERT(VARCHAR(12), pd.dateentered, 101) AS [dateentered]
    ,ba.partqty
    ,ba.STATUS
    ,ba.material
FROM tbl_dlbase ba
JOIN tbl_partdetails pd ON ba.referenceid = pd.referenceid
WHERE CASE @field1
        WHEN 'part #'
            THEN ba.partnum
        WHEN 'Spacing'
            THEN pd.spacing
        WHEN 'Surface'
            THEN pd.surface
        WHEN 'Height'
            THEN pd.height
        WHEN 'Thickness'
            THEN pd.thickness
        END LIKE '%' + @criteria1 + '%'