我有一个要搜索要编辑的产品的管理页面,但是该页面一直返回错误:
Microsoft OLE DB Provider for SQL Server错误'80040e14‘不明确的列名'prod_id’。/_admin/searchProducts.asp,第89行
我不知道为什么会出现此错误,因为页面和站点是另一个网站和相关MSSQL数据库的直接副本,搜索产品页在该站点上工作。
这是有问题的代码(不确定这里是否容易阅读);
if request("fldSubmitted") <> "" then
if request("fldprodid") <> "" and isNumeric(request("fldprodid")) then
SQL = "select * from products where prod_id = " & cdbl(request("fldprodid"))
else
SQL = "select "
if request("showtop") <> "all" then
SQL = SQL & " top " & request("showtop") & " " & replace(replace(request("orderby")," asc","")," desc","") & ", "
end if
SQL = SQL & "prod_name, prod_id, prod_code, prod_icon, prod_thumb, prod_numViews, prod_archived"
if request("fldLabel") <> "" then SQL = SQl & ", label_name"
if request("fldCat") <> "" then SQL = SQL & ", cat_name"
if request("fldSubcat") <> "" then SQL = SQL & ", subcat_name"
SQL = SQL & " from products"
if request("fldLabel") <> "" then SQL = SQL & ", labels"
if request("fldCat") <> "" then SQL = SQL & ", categories"
if request("fldSubcat") <> "" then SQL = SQl & ", subcategories"
sql = sql & " where 1=1"
if request("fldLabel")<> "" then SQL = SQL & "and prod_label = label_id "
if request("fldCat") <> "" then SQL = SQL & "and prod_category = cat_id "
if request("fldSubcat") <> "" then SQL = SQL & "and prod_subcategory = subcat_id "
if request("fldName") <> "" then SQL = SQL & " and (prod_name like '%" & replace(request("fldName"),"'","''") & "%')"
if request("fldCode") <> "" then SQL = SQL & " and (prod_code like '%" & replace(request("fldCode"),"'","''") & "%')"
if request("fldLabel") <> "" then SQL = SQL & " and prod_label = " & request("fldLabel")
if request("fldCat") <> "" then SQL = SQL & " and prod_category = " & request("fldCat")
if request("fldSubcat") <> "" then SQL = SQL & " and prod_subcategory = " & request("fldSubcat")
if request("fldArchived") = "No" then
SQL = SQL & " and prod_archived = 0"
if request("instock") = "No" then SQL = SQL & " and prod_numleft > 0"
end if
SQL = SQL & " order by " & request("orderby")
end if
发布于 2009-07-22 09:41:21
在查询的后半部分,您可以从表产品、标签、类别和子类别中选择。如果这些表中有一个prod_id,那么DBMS将不知道您所指的是哪个表。一个简单的修订是对每个表进行别名,例如产品p、标签l等。
一个更好的重构方法是将查询更改为我们联接:
SELECT p.prod_name, l.label_name
FROM products p
JOIN labels l
ON l.label_id = p.label_id
WHERE p.in_stock > 0
处理这些问题时的另一个技巧是将response.write字符串复制到Management中,这将帮助您看到将字符串操作传递给错误。
最后,我建议查看存储过程,这样您就可以从应用程序中删除SQL。
编辑
在评论中的一些聊天之后,如果存储过程是不可能的,那么参数化查询将是一个很好的进步。这将带来性能提高,因为查询计划将被缓存,并避免了最基本形式的SQL注入攻击。
发布于 2009-07-22 09:36:40
问题是查询将选择列prod_id
,但引用的多个表中有一个具有该名称的列。
查询返回多个表的结果,但确切地说,哪个表取决于各种参数的值。所以,这也许可以解释为什么它在一种情况下工作,而不是在另一种情况下工作。
通过在prod_id
引用前面加上表名,可以使它明确无误。
myTable.prod_id
我认为(对您来说)哪个表是正确的(当然,它必须是查询的一部分,而不是在特定条件下存在的表),这是相当明显的。
发布于 2009-07-22 09:35:30
您确定在查询中使用的表列表中只有一个列名为prod_id的表吗?
https://stackoverflow.com/questions/1164108
复制相似问题