我正在寻找一种方法来使用一个参数作为结果,可以在以后的行中插入另一个select语句。
这是我能够通过手动将列出的所有四个日期更改为我想要的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
作为&#39; 2017-02-14&#39;由于select语句,它将发布2017-02-14。
答案 0 :(得分: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')
关于表函数的IMHO最好的事情是它们可以连接到现有的东西,因为它们是数据库中格式良好的对象。当您执行过程和动态SQL时,您将获得结果集,但这并不意味着您的代码可以加入。表函数可以交叉应用于cte的运行,并且它们可以连接到其他表。所以基本上它们更适合重用,但它们有规则,所以你不能做更高级的事情,比如动态sql(据我所知,除非他们最近改变它)和其他东西。但是如果你想要一个可重复使用的数据集,其中包含管理输入的规则,那就完全就是它们的用途。