2017-02-14 49 views
0

我正在尋找一種方法來使用一個參數作爲結果,可以插入到另一個選擇語句後面的行。參數作爲結果

這是我能夠通過手動改變列出我想要

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聲明的前半部分的日期的所有四個拉CTE select語句像這樣的參數

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發佈,作爲選擇聲明的結果。

+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中做更高級的事情(據我所知,除非他們最近改變了)等等。但是如果你想要一個可重複使用的數據集和規則來管理輸入,那幾乎就是他們所做的。