2014-08-29 106 views
3

我运行这是给我的关于“多部分标识符”错误动态SQL。由于我在不同的表中使用了相同名称的列,所以我在列名前加上一个表别名,这似乎是问题所在。T-SQL错误:“多部分标识符X.Y无法绑定”

报告的错误是:

The multi-part identifier e.Categorydescription could not be bound.
The multi-part identifier l.FullAddress could not be bound.

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

我错估了错误。实际的错误是进一步下跌(下图)在我从##读码结果全局表:

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" 
+0

shoule e.CategoryDe​​scription是c.CategoryDe​​scription。如果你添加了表格结构,这将有所帮助。 – 2014-08-29 09:20:15

+0

@ user2906420:我简化了您的问题,使其更容易和更快速阅读。你已经用你的'PRINT'输出显示了什么实际的SQL查询被执行了,所以我删除了不相关的位(从几个变量构建SQL查询的地方)并且替换了实际的SQL。 (如果你不同意它,请随意回滚我的编辑。) – stakx 2014-08-29 09:29:54

+2

我对你的'SELECT'列'## RowNum'很好奇。我明白[表格名称(全局临时表格)]中的##是什么意思(http://stackoverflow.com/a/3166130/240733),但列名称...?这是一个有效的列名,或者你需要**(a)**删除'##';或者**(b)**通过将其放在尖括号中来转义列名:'[## RowNum]'? – stakx 2014-08-29 09:35:43

回答

2

不能发表评论,对不起。

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

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

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'; 

这应该(不上前面的多标识符IE)显示Balance_Date,全名,CategoryDe​​scription和FullAddress的列名。

下降的多,只是引用它们作为CATEGORYNAMES和fulladdress甚至更好的再别名他们,你知道的,100%,列的##结果中的名字是什么。

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包含这些别名。

相关问题