2008-12-03 16 views

risposta

32

È necessario utilizzare CROSS APPLY per raggiungere questo

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

Non ho mai usato 'CROSS APPLY' prima, Ora ne vedo il vantaggio, Grazie mille @kristof. –

0

Che sembra ok a me, se non che si dovrebbe sempre anteporre le funzioni con il loro schema (di solito dbo). Quindi la domanda dovrebbe essere:

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

Non credo, funzionerebbe. se non definisci la @param, otterrai: Devi dichiarare la variabile scalare "@param". errore. Se si definisce @param, i risultati verranno assegnati a qualunque sia @param assegnato (NULL per impostazione predefinita). Per ottenere l'intera serie di risultati è necessario utilizzare CROSS APPLY – kristof

+0

Di cosa stai parlando? Sto semplicemente correggendo la query che è stata offerta nella frase. Rajivdas non ha mai dichiarato l'intento della sua domanda, quindi non puoi sapere se ha bisogno di fare una domanda incrociata o meno. –

+0

Vero, la domanda non è molto chiara, ho basato la mia risposta sui commenti fatti da Rajivdas per rispondere a Josh. Guarda il commento di NTulip per vedere come si confondono alcune persone. Ma sicuramente potrebbe essere stato io a interpretare erroneamente – kristof

3

Le seguenti opere nel database 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) 

EDIT

sulla base di competenze Kristof ho aggiornato questo campione, se il vostro cercando di ottenere più valori per esempio:

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

nel mio caso, posso solo i risultati per employeeId = 10, ma non per l'altro valore. Qualche idea? –

+0

sembra che tu stia cercando di fare qualcosa di più complesso della tua domanda indicata. (Che avevo la sensazione che tu fossi). Si vuole passare per esempio a tutti gli userId ... un modo sarebbe quello di costruire una stringa delimitata e poi scomporla nella funzione, ma che sconfigge lo scopo. – JoshBerke

+0

Josh. L'esempio che hai fornito è in realtà lo stesso di chiamare select * da EmployeeById (10) WHERE 10 in (SELECT EmployeeId FROM HumanResources.Employee). Per ottenere risultati per più valori di parametro è necessario utilizzare cross apply (SQLServer2005 +) – kristof

Problemi correlati