2008-12-03 2 views

ответ

32

Вам необходимо использовать CROSS ОТНОСИТЬСЯ для достижения этой

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

Я никогда раньше не использовал 'CROSS APPLY', теперь я вижу его преимущество, Большое спасибо @kristof. –

0

Это выглядит хорошо для меня, за исключением того, что вы всегда должны префиксом своих функций с их схемой (обычно DBO). Таким образом, запрос должен быть:

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

Не думаю, что это сработало. если вы не определяете @param, вы получите: Должен объявить скалярную переменную «@param». ошибка. Если вы определяете @param, вы получите результаты в соответствии с тем, что присвоено @param (по умолчанию NULL). Чтобы получить полный набор результатов, вам нужно использовать CROSS APPLY – kristof

+0

О чем вы говорите? Я просто корректирую запрос, предложенный в предложении. Радживдас никогда не заявлял о намерении своего запроса, поэтому вы не можете знать, нужно ли ему делать КРЕСТНОЕ ПРИМЕНЕНИЕ или нет. –

+0

Правда, вопрос не очень ясен, я основывал свой ответ на комментариях, которые Радживдас ответил Джошу. Посмотрите на комментарий от NTulip, чтобы узнать, как смущают некоторые люди. Но, наверняка, это мог быть тот, кто неправильно интерпретировал – kristof

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) 

EDIT

основы Кристоф экспертизы Я обновил этот пример, если вы пытаетесь получить несколько значений, которые вы может, например, сделать:

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

. В моем случае я могу получить только результаты для employeeId = 10, но не для другого значения. Есть идеи? –

+0

звучит так, будто вы пытаетесь сделать что-то более сложное, чем ваш вопрос. (Который я чувствовал, что ты был). Вы хотите передать, например, все userId ... одним способом было бы построить строку с разделителями, а затем сломать ее в функции, но это победит цель. – JoshBerke

+0

Джош. Пример, который вы ему дали, на самом деле совпадает с вызовом select * from EmployeeById (10) WHERE 10 in (SELECT EmployeeId FROM HumanResources.Employee). Чтобы получить результаты для нескольких значений параметра, вам нужно использовать cross apply (SQLServer2005 +) – kristof

Смежные вопросы