【问题标题】:T-SQL error: "The multi-part identifier X.Y could not be bound"T-SQL 错误:“无法绑定多部分标识符 X.Y”
【发布时间】:2014-10-23 06:22:37
【问题描述】:

我正在运行一个动态 SQL,它给我一个关于“多部分标识符”的错误。因为我在不同的表中有同名的列,所以我在列名前加上表别名,这似乎是问题所在。

报告的错误是:

无法绑定多部分标识符e.Categorydescription
无法绑定多部分标识符l.FullAddress

Categorydescription 列存在于表EventsCategories 中,FullAddress 列存在于表EventsLocation 中,因此我使用e.Categorydescriptionl.FullAddress。我无法删除内部连接,因为我需要 LocationCategories 表中的其他列。

我误判了错误。实际错误在我从##Results 全局表中读取的代码中更靠下(如下):

SET @s_query =  'SELECT ' + @ColNames + ' FROM ##Results
    WHERE ##RowNum BETWEEN('+CONVERT(varchar(20),@PageIndex)+'-1) * '+
    CONVERT(varchar(20),@PageSize)+' + 1 
    AND((('+CONVERT(varchar(20),@PageIndex)+' -1) * '+
    CONVERT(varchar(20),@PageSize)+' + 1) + '+CONVERT(varchar(20),@PageSize)+') - 1
    ORDER BY ##RowNum';

EXEC (@s_query); -- the error is from here 
--because #Results# has "Categorydescription" instead of "e.Categorydescription"

【问题讨论】:

  • 应将 e.CategoryDe​​scription 设为 c.CategoryDe​​scription。如果您添加表结构会有所帮助。
  • @user2906420:我已对您的问题进行了缩写,以便于阅读。您已经使用PRINT 输出显示了实际执行的 SQL 查询,因此我删除了不相关的位(您从多个变量构建 SQL 查询的位置)并替换了实际的 SQL。 (如果您不同意我的编辑,请随时回滚。)
  • 我很好奇你的SELECT专栏##RowNum。我了解what ## means in table names (global temporary tables),但是有列名……?这是一个有效的列名,还是您需要(a) 删除##;或 (b) 通过将列名放在尖括号中来转义:[##RowNum]?
  • 我将在上面更新表格结构。 @stakx 是的,它是一个有效的列,因为我将上面的相同代码与其他存储过程一起使用,这些存储过程在表中没有相同的列名。所以上面的代码结构可以正常工作,但是多部分标识符存在问题。
  • @SteveFord 我尝试用 cat.Categorydescription 更改 e.Categorydescription 但同样的错误

标签: sql sql-server tsql


【解决方案1】:

还不能发布 cmets,抱歉。

@ColNames - 这是什么? e.categorynames 或 categorynames ?

我假设你在这里有 e.categorynames 和 l.fulladdress。由于同一列存在于两个位置,SQL Server 绝对需要 select 中的多部分引用,但是结果列将只是 Columnname。您可以通过仅将部分查询作为标准选择运行来证明这一点

Select   Balance_Date,
       FullName,
       e.Categorydescription,
       l.FullAddress
From [Events] e
inner join Person c ON e.Pid = c.Pid
inner join Categories cat ON e.Cid = cat.Cid
inner join Location l ON e.Lid = l.Lid';

这应该显示 Balance_Date、FullName、CategoryDe​​scription 和 FullAddress 的列名(即前面没有多部分标识符)。

删除多部分并将它们作为类别名称和完整地址引用,甚至更好地重新命名它们,以便您 100% 知道##results 中列的名称。

SET @s_query = '
    Select ROW_NUMBER() OVER (ORDER BY Balance_Date asc) AS ##RowNum,
       Balance_Date AS Balance_Date,
       FullName AS Fullname,
       e.Categorydescription AS CategoryDescription,
       l.FullAddress AS FullAddress
INTO ##Results
From [Events] e
inner join Person c ON e.Pid = c.Pid
inner join Categories cat ON e.Cid = cat.Cid
inner join Location l ON e.Lid = l.Lid';

然后确保@ColNames 包含这些别名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多