2008-12-03 156 views
20

我要像做如何通過參數表值函數

select * from tvfHello(@param) where @param in (Select ID from Users) 
+0

Rajivdas:你能否澄清你的問題多一點。恐怕我們每個人都用不同的方式解釋它 – kristof 2008-12-03 16:07:43

回答

32

您需要使用CROSS APPLY實現此目的

select 
    f.* 
from 
    users u 
    cross apply dbo.tvfHello(u.ID) f 
0

這看起來不錯給我,除了你應該總是與他們的架構(通常是DBO)前綴的功能。因此,查詢應該是:

SELECT * FROM dbo.tvfHello(@param) WHERE @param IN (SELECT ID FROM Users) 
+1

我不認爲,那會奏效。如果你沒有定義@param,你會得到:必須聲明標量變量「@參數」。錯誤。如果你定義了@param,你會得到結果給任何@param分配的(默認爲NULL)。要獲得全套結果,您需要使用CROSS APPLY – kristof 2008-12-03 10:45:38

+0

你在說什麼?我只是糾正了句子中提供的查詢。 Rajivdas從未說明他的查詢的意圖,所以你不可能知道他是否需要進行CROSS APPLY。 – 2008-12-03 11:05:45

+0

的確,問題並不十分清楚,我根據Rajivdas提出的評論回答喬希的回答。看看NTulip發表的評論,看看有些人感到困惑。但肯定的是,我本來可能會在我的案例中錯誤地解釋 – kristof 2008-12-03 16:05:09

3

在AdventureWorks數據庫以下工作:

CREATE FUNCTION dbo.EmployeeByID(@employeeID int) 
RETURNS TABLE 
AS RETURN 
(
    SELECT * FROM HumanResources.Employee WHERE EmployeeID = @employeeID 
) 
GO 


DECLARE @employeeId int 

set @employeeId=10 

select * from 
EmployeeById(@employeeId) 
WHERE @EmployeeId in (SELECT EmployeeId FROM HumanResources.Employee) 

編輯

基於克里斯托夫的專業知識,如果你試圖讓你多值我已經更新了這個樣本可以舉例:

select * 
from HumanResources.Employee e 
CROSS APPLY EmployeeById(e.EmployeeId) 
WHERE e.EmployeeId in (5,6,7,8)