2015-08-27 54 views
0

我有一個表值函數,我需要在存儲過程中使用:T-SQL錯誤試圖加入表函數在存儲過程

LEFT OUTER JOIN [dbo].FT_GET_PRICES(getdate()) e (NOLOCK) 
    ON rm.rmap_no = e.rmap_no 
    AND s.zone_no = e.zone_no 

然而,當我運行的SP我得到這個錯誤:

Msg 317, Level 16, State 1, Procedure SP_SALES, Line 119
Table-valued function 'FT_GET_PRICES' cannot have a column alias.

我想通SQL要我做這樣的事情:

LEFT OUTER JOIN [dbo].FT_GET_PRICES(getdate()) (NOLOCK) 
    ON rm.rmap_no = [dbo].FT_GET_PRICES.rmap_no 
    AND s.zone_no = [dbo].FT_GET_PRICES.zone_no 

...但我仍然得到錯誤說我使用的是別名。我該如何解決這個問題,以及如何在沒有別名的情況下引用存儲過程中的函數?

+0

你怎麼從'從FT_GET_PRICES選擇*(GETDATE())'得到什麼? –

+2

爲什麼在處理價格時使用NOLOCK?你確定價格不準確嗎?我的猜測是你需要在這裏使用APPLY,但有這麼小的一部分,很難看到發生了什麼。如果你打算使用NOLOCK,你還需要使用WITH關鍵字。不包括該關鍵字在表格提示中已被棄用,並且將是必需的。這裏有一些關於NOLOCK的詳細信息。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

+不知道你需要NOLOCK –

回答

1

更好地利用CROSS APPLY

CROSS APPLY [dbo].FT_GET_PRICES(getdate())(rm.rmap_no, s.zone_no) 

或很可能使用派生的查詢像

select .... from some_table rm 
LEFT OUTER JOIN 
(
select * from [dbo].FT_GET_PRICES(getdate()) 
) e ON rm.rmap_no = e.rmap_no 
+0

這仍然沒有解決如何使用WITH(NOLOCK)對TVF([實際答案在這裏](http://dba.stackexchange.com/a/71176/1186))。 –

0

它的治療(NOLOCK)作爲列別名功能。刪除它並嘗試。

LEFT OUTER JOIN [dbo].FT_GET_PRICES(getdate()) e 

ON rm.rmap_no = e.rmap_no 和s.zone_no = e.zone_no

+0

你必須在這裏有你失蹤的功能的別名。 –

+0

對不起。我編輯了我的答案。 –

1

鎖定提示上TVFunctions這樣

LEFT OUTER JOIN [dbo].FT_GET_PRICES(getdate()) (NOLOCK) 

將產生別名出錯。如果您需要使用這種提示(在這種情況下您不這樣做),請將它們放入選擇查詢表達式中,而不是直接加入連接語法的一部分。所以,

LEFT OUTER JOIN [dbo].FT_GET_PRICES(getdate()) 

將修復別名錯誤。