Я хочу сделать что-то вродеКак передать параметры в таблице значной функции
select * from tvfHello(@param) where @param in (Select ID from Users)
Я хочу сделать что-то вродеКак передать параметры в таблице значной функции
select * from tvfHello(@param) where @param in (Select ID from Users)
Вам необходимо использовать CROSS ОТНОСИТЬСЯ для достижения этой
select
f.*
from
users u
cross apply dbo.tvfHello(u.ID) f
Я никогда раньше не использовал 'CROSS APPLY', теперь я вижу его преимущество, Большое спасибо @kristof. –
Это выглядит хорошо для меня, за исключением того, что вы всегда должны префиксом своих функций с их схемой (обычно DBO). Таким образом, запрос должен быть:
SELECT * FROM dbo.tvfHello(@param) WHERE @param IN (SELECT ID FROM Users)
Не думаю, что это сработало. если вы не определяете @param, вы получите: Должен объявить скалярную переменную «@param». ошибка. Если вы определяете @param, вы получите результаты в соответствии с тем, что присвоено @param (по умолчанию NULL). Чтобы получить полный набор результатов, вам нужно использовать CROSS APPLY – kristof
О чем вы говорите? Я просто корректирую запрос, предложенный в предложении. Радживдас никогда не заявлял о намерении своего запроса, поэтому вы не можете знать, нужно ли ему делать КРЕСТНОЕ ПРИМЕНЕНИЕ или нет. –
Правда, вопрос не очень ясен, я основывал свой ответ на комментариях, которые Радживдас ответил Джошу. Посмотрите на комментарий от NTulip, чтобы узнать, как смущают некоторые люди. Но, наверняка, это мог быть тот, кто неправильно интерпретировал – kristof
следующие работы в базе данных 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)
. В моем случае я могу получить только результаты для employeeId = 10, но не для другого значения. Есть идеи? –
звучит так, будто вы пытаетесь сделать что-то более сложное, чем ваш вопрос. (Который я чувствовал, что ты был). Вы хотите передать, например, все userId ... одним способом было бы построить строку с разделителями, а затем сломать ее в функции, но это победит цель. – JoshBerke
Джош. Пример, который вы ему дали, на самом деле совпадает с вызовом select * from EmployeeById (10) WHERE 10 in (SELECT EmployeeId FROM HumanResources.Employee). Чтобы получить результаты для нескольких значений параметра, вам нужно использовать cross apply (SQLServer2005 +) – kristof
Rajivdas: могли бы вы уточнить ваш вопрос немного больше. Я боюсь, что каждый из нас интерпретировал это по-разному. – kristof