Можно ли превратить написанную мной табличную функцию в View в Sql Server 2005 - PullRequest
0 голосов
/ 24 марта 2011

Я все еще новичок во всем этом, и я думаю, что, возможно, я сделал это не лучшим образом.У меня есть функция Table Valued, которую я написал, но я думаю, что ее можно записать в виде представления.

Большая проблема в том, почему я использовал функцию 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 Ответ

2 голосов
/ 24 марта 2011

Вы можете использовать общее табличное выражение (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...