2017-02-14 51 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中做更高级的事情(据我所知,除非他们最近改变了)等等。但是如果你想要一个可重复使用的数据集和规则来管理输入,那几乎就是他们所做的。