参数作为结果

时间:2017-02-14 17:51:02

标签: sql-server-2008 tsql parameters

我正在寻找一种方法来使用一个参数作为结果,可以在以后的行中插入另一个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。

1 个答案:

答案 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(据我所知,除非他们最近改变它)和其他东西。但是如果你想要一个可重复使用的数据集,其中包含管理输入的规则,那就完全就是它们的用途。