繁体   English   中英

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

[英]SQL Server error '80040e14' Ambiguous column name

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

SQL Server错误“ 80040e14”的Microsoft OLE DB提供程序。列名“ 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

问题在于查询将选择列prod_id ,但是所引用的多个表中有一个具有该名称的列。

该查询从一个以上的表中返回结果,但是究竟哪个表取决于各种参数的值。 因此,这可以解释为什么它在一种情况下有效,而在另一种情况下无效。

您可以使用表名作为前缀, prod_id使prod_id引用明确无误,例如

myTable.prod_id

我认为(对您来说)哪个表是正确的表(当然,表必须始终是查询的一部分,而不是仅在某些条件下才存在的表)。

在查询的后半部分,您可以从表中选择产品,标签,类别和子类别。 如果这些表中的任何一个都有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 SQL字符串并将其复制到Management Studio中,这将帮助您查看将字符串操作传递给错误的方法。

最后,我建议您查看存储过程,以便可以从应用程序中删除SQL。

编辑

在注释中的一些聊天之后,如果存储过程不可行,则参数化查询将是一个不错的选择。 由于查询计划将被缓存,这将带来性能提升,并且避免了SQL注入攻击的最基本形式。

您确定在查询中使用的表列表中只有一个表的列名为prod_id吗?

该代码很难阅读和理解,但是除非您可以保证在工作和非工作场景中都可以运行相同的查询,否则我将其归结为这一点。

当您在查询中具有多个具有相同列名的表或视图并且未明确说明要使用哪个表或视图时,通常会出现此错误。 如果要避免多义性,则应养成在表/视图的所有列前加上前缀的习惯。

编辑:在此示例中,显然您的产品表具有prod_id,但您可能可以确认标签,类别或子类别也具有prod_id列

感谢您的所有答复。 很抱歉没有尽快回复,但我还没有收到任何提醒人们回答的警报。 大声笑。

我现在似乎已经修复了该错误。 我从以下行中删除了“ prod_id”; SQL = SQL&“ prod_name,prod_id,prod_code,prod_icon,prod_thumb,prod_numViews,prod_archived”

似乎现在可以正常工作。 另一个站点使用完全相同的代码,但现在全部排序,这有点奇怪。 :D

再次感谢您的答复。 非常感谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM