我有一个管理页面来搜索要编辑的产品,但页面会一直返回错误:
用于SQL Server的Microsoft OLE DB提供程序错误“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
答案 0 :(得分:5)
问题是查询将选择列prod_id
,但引用的多个表中有一个列具有该名称。
查询返回多个表的结果,但 表完全取决于各种参数的值。所以,这可以解释为什么它在一种情况下起作用而在另一种情况下起作用。
您可以在prod_id
引用前加上表名称前缀,使其明确无误,例如
myTable.prod_id
我认为(对你来说)哪个表是正确的(当然它必须是一个始终是查询的一部分的表,而不是仅在某些情况下才存在的表)。
答案 1 :(得分:3)
在查询的后半部分,您可以从表中选择产品,标签,类别和子类别。如果这些表中的任何一个具有prod_id,则DBMS将不知道您指的是哪一个。一个简单的修订是对每个表进行别名,例如产品p,标签l等。
更好的refacotoring将改变查询到我们加入:
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
处理这些问题时的另一个提示是响应。编写SQL字符串并将其复制到Management Studio中,这将帮助您看到将字符串操作传递给错误。
最后,我建议您查看Stored Procedures,以便从应用程序中删除SQL。
修改的
在评论中的一些聊天之后,如果存储过程是不可能的,那么parameterized query将是向前迈出的一大步。这将带来性能提升,因为查询计划将被缓存并避免最基本的SQL注入攻击形式。
答案 2 :(得分:0)
您确定在查询中使用的表列表中只有一个表名为prod_id的列吗?
答案 3 :(得分:0)
代码有点难以阅读和完成,但除非你能保证在工作和非工作场景中运行相同的查询,否则我会把它归结为。
如果查询中有多个表或视图具有相同的列名,并且未明确说明您要使用哪个表,则通常会出现此错误。你应该养成为所有列添加表格/视图前缀的习惯,如果有多个列可以避免含糊不清。
编辑:在这个例子中,显然你的产品表有一个prod_id,但你可能能够确认标签,类别或子类别也有一个prod_id列
答案 4 :(得分:0)
感谢您的所有回复。很抱歉没有尽快回复,但我没有收到任何警告,说人们已经回复了。洛尔。
我似乎现在修复了错误。我从以下行删除了'prod_id'; SQL = SQL&amp; “prod_name,prod_id,prod_code,prod_icon,prod_thumb,prod_numViews,prod_archived”
现在似乎工作正常。有点奇怪,其他网站使用完全相同的代码,但现在全部排序。 :d
再一次,非常感谢回复。非常感谢。