SQL Server错误'80040e14'不明确的列名称

时间:2009-07-22 09:29:14

标签: sql sql-server asp-classic

我有一个管理页面来搜索要编辑的产品,但页面会一直返回错误:

  

用于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

5 个答案:

答案 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

再一次,非常感谢回复。非常感谢。