不明确的列名,我的WHERE语句已经被用于其他目的

时间:2013-03-27 12:06:35

标签: sql sql-server join where

所以我有这个问题,我需要一个INNER JOIN将我的imagetable连接到我的产品表,而且我已经尝试通过连接到表来指定每个coloumn名称,如下所示。说到我的WHERE语句,这就是它变得棘手的地方。因为我需要将我的ProductID保存为一个名为pid的变量,以用于其他代码隐藏目的。

SELECT * FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID 
WHERE (ProductID = @pid)

当我运行此代码时,它会告诉我ProductID是一个模糊的列名称,当我尝试时 更进一步指定我的Where语句:

WHERE (p.ProductID = @pid)

它会给我另一个错误,告诉我没有数据绑定到我从中取出数据的某些行。只有在我没有像上面那样指定Where语句时才会出现此错误。

任何输入都将非常感激:)

PS:我正在运行MSSQL,如果有话要说的话。

4 个答案:

答案 0 :(得分:1)

“模糊列名称”消息是SQL Server错误,您通过指定“WHERE p.ProductID = @pid”来修复它。是的,你需要p。在ProductID前面,因为ImageTBL也有一个同名的列。

“没有数据绑定”错误不是来自SQL。你现在有一个正确的SQL语句,但它显然没有返回任何记录,至少对于你正在运行它的@pid的值。

你是从试图对数据做某事的应用程序中调用它的,对吧?这就是“无数据绑定”错误的来源。

您可以通过在SQL Server Management Studio查询窗口中运行SQL语句,并为@pid插入所需的值来分离问题的两个部分。然后,您可以在调试模式下运行应用程序,并检查它是否正在接收您在Management Studio中看到的相同数据。这是一个猜测:您的应用程序没有正确传递@pid,并且SQL语句返回p.ProductID =''的记录。看看是不是正在发生的事情。

答案 1 :(得分:1)

我知道有两种方法可以做到这一点。第二种方式可能是推荐的方式(它应该更快地运行)。

方式1)

以两步语句运行它。我认为你不能在内部SELECT语句中使用*:

SELECT * FROM (
    SELECT p.ProductID, [other needed fields]
    FROM ProductTBL p
    INNER JOIN ImageTBL img on p.ProductID = img.ProductID
    ) as x
WHERE (ProductID = @pid)

内部SELECT p.ProductID表示从ProductTBL显式返回ProductID。然后可以在WHERE语句中使用该ProductID字段,因为它位于外部SQL语句中。

方式2)

将“WHERE”标准作为联接的一部分

SELECT *
FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID AND p.ProductID = @pid

答案 2 :(得分:0)

这可能是您的代码的问题。尝试使用产品ID的核心值运行查询,并在数据库控制台中运行它。

它似乎不是数据库问题

答案 3 :(得分:0)

好吧,那就是有问题的地方。您需要在productID前加上表别名。表别名'很好,我毫无疑问你已经意识到,当你输入SELECT * From MyTable T,然后返回选择你的列时,你会得到一个列的intellisnce列表,你替换* by T. Aliasing tables is总是好的。假设您有两个表T1和T2以及T1中的C1,C2,C3列和T2中的C4,C5,C6。您编写存储过程的脚本,它的工作原理。有一段时间后,somone出现并将名为C2的c列添加到T2,如果你没有在列上添加表名,那么你的程序可能会中断。因此,即使没有当前的歧义并且您永远不会更改存储过程,使用前缀总是更加健壮。

明确说明列而不是使用*始终是一个好主意,因为再次添加列可能会破坏您的过程,如果您的列名不正确,SSMS将使用一点红色下划线加下划线。