2008-12-03 22 views

Respuesta

32

Necesita usar CROSS APPLY para lograr este

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

Nunca antes había usado 'CROSS APPLY', ahora veo su ventaja, muchas gracias @kristof. –

0

Eso se ve bien para mí, excepto que siempre se debe anteponer sus funciones con su esquema (por lo general DBO). Así que la pregunta debería ser:

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

No creo, eso funcionaría. si no define @param obtendrá: Debe declarar la variable escalar "@param". error. Si define el @param, obtendrá los resultados a lo que sea que @param esté asignado (NULL por defecto). Para obtener el conjunto completo de resultados, debe utilizar CROSS APPLY – kristof

+0

¿De qué está hablando? Simplemente estoy corrigiendo la consulta que se ofreció en la oración. Rajivdas nunca mencionó el propósito de su consulta, por lo que no puede saber si necesita hacer una SOLICITUD CRUZADA o no. –

+0

Es cierto, la pregunta no es muy clara, basé mi respuesta en los comentarios que Rajivdas hizo para responder por Josh. Mira el comentario de NTulip para ver cuán confundida está la gente. Pero seguramente podría haber sido yo quien lo interpretó erróneamente – kristof

3

Los siguientes trabajos en la base de datos 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) 

EDITAR

basada en la experiencia Kristof he actualizado esta muestra si su tratando de obtener múltiples te valora podría por ejemplo hacer:

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

en mi caso solo puedo obtener los resultados para employeeId = 10, pero no para el otro valor. ¿Algunas ideas? –

+0

suena como si tratara de hacer algo más complejo que su pregunta indicada. (Que tuve la sensación de que eras) Si desea pasar, por ejemplo, todos los ID del usuario ... una forma sería construir una cadena delegada y luego descomponerla en la función, pero eso frustra el propósito. – JoshBerke

+0

Josh. El ejemplo que usted dio es en realidad lo mismo que llamar a select * from EmployeeById (10) WHERE 10 in (SELECCIONAR EmployeeId FROM HumanResources.Employee). Para obtener resultados para múltiples valores de parámetro, debe usar cross apply (SQLServer2005 +) – kristof

Cuestiones relacionadas