Измените табличную функцию (TVF) для нескольких операторов на встроенный TVF - PullRequest
0 голосов
/ 25 ноября 2010

Использование SQLServer 2008.

Пример TVF с несколькими утверждениями:

CREATE TABLE DBO.DECTEST (ID INT NOT NULL PRIMARY KEY, 
V1 DECIMAL(18,6) NOT NULL, V2 DECIMAL(18,6) NOT NULL)

INSERT DECTEST VALUES (1, 23.1234, 25.22)

GO

DROP FUNCTION DBO.F_DECTEST1
GO
CREATE FUNCTION DBO.F_DECTEST1
(
@ID INT
)
RETURNS @RESULT TABLE
(   
    V1 DECIMAL(18,6),
    V2 DECIMAL(18,6)
)
AS 
BEGIN
    DECLARE @V1 DECIMAL (18,6)
    DECLARE @V2 DECIMAL(18,6)
    SELECT @V1 = V1, @V2 = V2 FROM DBO.DECTEST WHERE ID = @ID

    INSERT @RESULT (V1, V2) VALUES (ISNULL(@V1, 0), ISNULL(@V2, 0))
    RETURN
END
GO

Я хочу изменить это на встроенный TVF (из соображений производительности).Обратите внимание, что одна строка всегда возвращается в наборе результатов - даже если передается несуществующий идентификатор.Есть ли чистый способ сделать это?

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Не знаю, лучше ли это, но вы можете попробовать ...

CREATE FUNCTION DBO.F_DECTEST1 
( 
@ID INT 
) 
RETURNS TABLE 
AS  
RETURN
(
   SELECT V1, V2 FROM DBO.DECTEST WHERE ID = @ID 
   UNION ALL
   SELECT NULL AS V1, NULL AS V2 WHERE NOT EXISTS (SELECT 1 FROM DBO.DECTEST WHERE ID = @ID)
)

Кроме того, почему бы не пойти с сохраненным процессом с выходными параметрами?Поскольку идентификатор уникален и вам нужно вернуть только одну строку.

0 голосов
/ 25 ноября 2011

Для тех, кто все еще заинтересован, это то, что мне было нужно (обратите внимание, что я должен был сделать столбцы V1 и V2 NULL-способными в моем исходном примере, чтобы больше отражать то, что я преследовал):

CREATE FUNCTION DBO.F_DECTEST1
(
@ID INT
)
RETURNS TABLE
AS 
RETURN
(
    SELECT ISNULL(w.V1, 0) AS V1 , ISNULL(w.V2, 0) AS V2
    FROM 
    (SELECT @ID AS ID) s 
    OUTER APPLY
    (
        SELECT V1, V2 FROM DBO.DECTEST WHERE ID = s.ID
    ) w
)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...