2014-08-29 108 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包含這些別名。

相關問題