可以将我编写的Table Valued函数转换为Sql Server 2005中的View

时间:2011-03-24 13:09:33

标签: sql-server-2005

我仍然对这一切都很陌生,我想我可能没有以最好的方式做到这一点。我有一个我写的表值函数,但我认为它可以写成一个视图。

为什么我使用表val函数的大问题是,如果select查询没有返回结果,那么我想返回一个显示空值和时间戳的“默认”行,我不知道如何在视图中这样做。

我认为这里的专家知道如何。这是功能:

alter FUNCTION [dbo].[GetCurrentRTBindingConstraints]()
RETURNS 
    @CurrentBindingConstraints table (
     CONSTRAINTNAME [nvarchar] (120),
     MKTHOUR_EST [dateTime],
     MARGINALVALUE  [nvarchar] (20)
    )
AS
BEGIN
    INSERT INTO @CurrentBindingConstraints 
select * from 
OPENQUERY(UDS9, 'select
 CONSTRAINTNAME, MKTHOUR -(5/24) as MKTHOUR_EST,MARGINALVALUE 
from UDS9.MKTPLANCONSTRAINT mpc
where MARGINALVALUE != 0.00 and mpc.caseid=(SELECT caseid FROM uds9.MktCase
WHERE casestartinterval=(SELECT MAX(casestartinterval) FROM uds9.MktCase WHERE casestate=5 AND studymodeid=5)
AND casestate=5 AND studymodeid=5)')
    DECLARE @cnt INT
    SELECT @cnt = COUNT(*) FROM @CurrentBindingConstraints  
    IF @cnt = 0
        INSERT INTO @CurrentBindingConstraints (
            [CONSTRAINTNAME],
            [MKTHOUR_EST],
            [MARGINALVALUE])
        VALUES ('None',dbo.RoundTime(dbo.GetGMTtoEST(getutcdate())),'None') 
    RETURN
END

1 个答案:

答案 0 :(得分:2)

您可以使用公用表表达式(CTE)和排名函数,如下所示:

;with Defaulted as (
    select 'none' as Col1,CURRENT_TIMESTAMP as Col2,'none' as Col3,1 as init -- This is your default row
    union all
    select name,DATEADD(day,-1,CURRENT_TIMESTAMP),name,0 from sys.objects -- This is where you query for real rows
), Ranked as (
    select Col1,Col2,Col3,RANK() OVER (ORDER BY init) as rnk from Defaulted
)
select * from Ranked where rnk = 1

以上只是一个示例 - 您需要使用真实查询替换第一个CTE中的两个选择,并且应使用列名而不是select *。这是有效的,因为排名函数(RANK())能够评估整个结果集。


编辑 - 尝试使用您的实际查询:

create view CurrentRTBindingConstraints
as
;with Defaulted as (
    select CONSTRAINTNAME,MKTHOUR_EST,MARGINALVALUE,0 as init from 
OPENQUERY(UDS9, 'select
 CONSTRAINTNAME, MKTHOUR -(5/24) as MKTHOUR_EST,MARGINALVALUE 
from UDS9.MKTPLANCONSTRAINT mpc
where MARGINALVALUE != 0.00 and mpc.caseid=(SELECT caseid FROM uds9.MktCase
WHERE casestartinterval=(SELECT MAX(casestartinterval) FROM uds9.MktCase WHERE casestate=5 AND studymodeid=5)
AND casestate=5 AND studymodeid=5)')
    union all
    select 'None',dbo.RoundTime(dbo.GetGMTtoEST(getutcdate())),'None',1
), Ranked as (
    select CONSTRAINTNAME,MKTHOUR_EST,MARGINALVALUE,RANK() OVER (ORDER BY init) as rnk from Defaulted
)
select CONSTRAINTNAME,MKTHOUR_EST,MARGINALVALUE from Ranked where rnk = 1