使用SQL Server表值函数,如视图

时间:2016-09-08 14:16:36

标签: sql sql-server

我在SQL Server 2012中构建了一个表值函数,它在用户定义的日期和时间之前返回表中每个唯一车辆的最后一个已知位置:

CREATE FUNCTION [dbo].[LAST_AVL_LOC] (@dateIn datetime2(7))
RETURNS TABLE 
AS
RETURN
WITH summary AS (
    SELECT p.title, 
           p.local_Time,
           p.vgroup,
           p.speed,
           p.heading,
           p.latitude, 
           p.longitude,
           p.shape,
           ROW_NUMBER() OVER(PARTITION BY p.title ORDER BY p.local_Time desc) AS rk
           FROM ac.AVL_POINTS p where  p.local_Time < @dateIn)
SELECT s.*
  FROM summary s
WHERE s.rk = 1

此代码运行良好,可以在SQL中调用,如下所示:

select * from [dbo].[LAST_AVL_LOC]('09/05/2016')

这将返回表格中每张独特车辆的表格及其最后的已知位置和其他信息,这些信息将于09/05/2016之前发布。

我的问题是这个函数需要在SQL之外的GIS包中使用,并且对这个软件公开和“可调用”的唯一SQL结构是表和视图。我想在一个视图中包装这个表值函数,以便可以像这样的方式调用它并仍然返回相同的表:

select * from VIEW_LAST_AVL_LOC where last_date = '09/05/2016'

这样的壮举可能吗?

2 个答案:

答案 0 :(得分:0)

绝对可以实现。

我们为我合作的合同实施了类似的非规范化功能集。

如果我们想要查看特定日期的记录状态,我们只需传递日期,例如:(2015/05/01),它会返回当时的所有记录及其状态。

对于基于数据保险库的系统,我强烈推荐这种方法。

我们如何设置我们的已除名功能的示例

CREATE FUNCTION [dbo].[fn_Customer_Contacts_AsAt] (@date datetime(7))
RETURNS TABLE 
AS
    SELECT 
        h.hk_Customer_Contact
        h.Number
        s.CustomerID
        s.CustomerName
        s.Job_ID
        s.Title
        s.Description
        s.Loaction
        s.Submit_Date
        s.Fulfill_Date
    FROM
            dvr.hub_Customer_Contacts h
    join    dvr.sat_Customer_Contacts s     on h.hk_Customer_Contact = s.hk_Customer_Contact
    WHERE
        s.Load_Date > @date
    and s.Load_EndDate < @date

答案 1 :(得分:0)

创建不带条件的视图(其中p.local_Time&lt; @dateIn )。因此它将包含所有数据,您可以使用以下查询:

从VIEW_LAST_AVL_LOC中选择*,其中last_date =&#39; 09/05 / 2016&#39;

注意:我们不能在Views中使用参数。