Я поражаю какое-то странное поведение в функции с табличной оценкой при использовании с OUTER APPLY. У меня есть простая встроенная функция, которая возвращает некоторые простые вычисления, основанные на строке в другой таблице. Когда входные значения для TVF являются жестко запрограммированными скалярами, возврат строки невозможен. Когда я беру одни и те же скаляры и вывожу из них одну строку в CTE, вы можете их подавать в виде столбцов, используя CROSS APPLY, без набора результатов. Когда я делаю то же самое с OUTER APPLY, я получаю 1 строку (как и ожидалось), но два из столбцов вывода NULL
и два других NOT NULL
. На основе BOL это не должно происходить с OUTER APPLY
. Это ошибка пользователя? Я написал простую версию, чтобы продемонстрировать эту проблему.
--Test set-up
CREATE FUNCTION dbo.TVFTest
(
@keyID INT,
@matchValue1 MONEY,
@matchValue2 MONEY
)
RETURNS TABLE AS RETURN
(
WITH TestRow
AS (SELECT @keyID AS KeyID,
@matchValue1 AS MatchValue1,
@matchValue2 AS MatchValue2)
SELECT KeyID,
MatchValue1,
MatchValue2,
CASE
WHEN MatchValue1 <> MatchValue2
THEN 'Not equal'
ELSE 'Something else'
END AS MatchTest
FROM TestRow
WHERE MatchValue1 <> MatchValue2
)
GO
Запрос
WITH Test AS
(
SELECT 12 AS PropertyID,
$350000 AS Ap1,
350000 AS Ap2
)
SELECT LP.*
FROM Test T
OUTER APPLY dbo.TVFTest
(
T.PropertyID,
T.Ap1,
T.Ap2
) LP;
Результаты
+-------+-------------+-------------+-----------+
| KeyID | MatchValue1 | MatchValue2 | MatchTest |
+-------+-------------+-------------+-----------+
| 12 | 350000.00 | NULL | NULL |
+-------+-------------+-------------+-----------+
Использование Cross Apply
не возвращает строк, как ожидалось. Также удаление CTE и использование встроенных констант не возвращает строки.
--Scalars, no row here...
SELECT LP.*
FROM dbo.TVFTest
(
12,
$350000,
350000
) LP;