2017-02-14 20 views
0

Я ищу способ использования параметра в результате, который может быть подключен к другому оператору выбора позже по строке.Параметр в результате

Это CTE отборного заявления, что я в состоянии тянуть вручную изменить все четыре дату, перечисленную на то, что я хочу

SELECT   CurrentYearEmp.PRCo, 
      CurrentYearEmp.Employee, 
      CASE 
      WHEN CurrentYearEmp.PREndDate <> '2016-11-20' 
       THEN '2016-11-20 00:00:00' 
      WHEN CurrentYearEmp.PREndDate = '2016-11-20' 
       THEN '2016-11-20 00:00:00' 
      END AS 'ParameterPREndDate' 

Я могу заменить первую половину WHEN заявления с параметр, подобный этому

SELECT   CurrentYearEmp.PRCo, 
      CurrentYearEmp.Employee, 
      CASE 
      WHEN CurrentYearEmp.PREndDate <> @PREndDate 
       THEN '2016-11-20 00:00:00' 
      WHEN CurrentYearEmp.PREndDate = @PREndDate 
       THEN '2016-11-20 00:00:00' 
      END AS 'ParameterPREndDate' 

Но он даст только результаты, которые я ищу, если параметр 2016-11-20. Я хочу иметь @PREndDate как '2017-02-14', он выведет 2017-02-14 в результате выражения select.

+1

Вы можете написать табличную функцию (TVF), которая возвращает все значения в одной строке. Результат может использоваться в запросе, например, с помощью 'JOIN' или' CROSS APPLY'. – HABO

ответ

0

Вы можете использовать функцию, обозначенную таблицей, как уже говорила HABO. Вот простой пример для одного:

/* 
--Create some dummy data in a db 
CREATE TABLE SomeData 
    (
     DataId INT IDENTITY 
    , Val   VARCHAR(8) 
    , Dt   DATE 
    ) 

INSERT INTO dbo.SomeData (Val, Dt) VALUES ('A', '2017-1-1'),('B', '2017-1-2'),('C', '2017-1-3'),('D', '2017-1-4'),('E', '2017-1-5') 

--Create a table valued function 
CREATE FUNCTION ReturnData (@StartDt DATE, @EndDt Date) 
RETURNS TABLE 
AS 
Return 
Select * 
From SomeData 
WHERE DT between @StartDt and @EndDt 
*/ 

Select * 
From ReturnData('1-1-2017', '1-3-2017') 

Самое лучшее ИМХО о табличные функции, они могут присоединиться к существующим вещам, поскольку они хорошо сформированы объекты в базе данных. Когда вы выполняете процедуры и динамический SQL, вы получаете набор результатов, но это не значит, что ваш код может быть объединен. Функции таблицы могут быть применены для перехода на cte, и их можно подключить к другим таблицам. По сути, они лучше подходят для повторного использования, но у них есть правила вокруг них, поэтому вы не можете делать более сложные вещи, такие как динамический sql в них (насколько я знаю, если они не изменили его в последнее время) и другие вещи. Но если вы хотите использовать многоразовый набор данных с правилами ввода данных, это в значительной степени то, для чего они предназначены.