Я читаю Microsoft 70-433 SQL Training Kit и столкнулся с примером, в котором они определяют следующее как «скалярный UDF»:
CREATE FUNCTION dbo.fnGetCustomerAccountNumber(@CustomerID INT)
RETURNS VARCHAR(10)
AS
BEGIN
RETURN ISNULL(
(
SELECT
AccountNumber
FROM Sales.Customer
WHERE CustomerID = @CustomerID
), 'NOT FOUND');
END
GO
Я понимаю, что скалярUDF (в отличие от табличного) возвращает одно значение, но мне кажется, что вышеприведенная функция будет возвращать только одно значение, если оператор SELECT возвращает только одну строку, что будет зависеть отсодержание таблицы.Но я рад предположить, что будет возвращен только один ряд (что будет, если его не будет?).Но ...
Затем они дают альтернативную версию, которая вместо вызова вышеуказанного UDF выполняет следующее:
SELECT
soh.SalesOrderID
, soh.OrderDate
, ISNULL(
(
SELECT
AccountNumber
FROM Sales.Customer
WHERE CustomerID = soh.CustomerID
), 'NOT FOUND')
FROM Sales.SalesOrderHeader AS soh;
Они противопоставляют этот второй пример, говоря: «Использование inlineТабличные UDF не влекут за собой такое же снижение производительности, как и использование скалярных UDF, потому что ... "
Итак, этот второй пример, хотя код идентичен первому, является табличным UDFа не скалярный?Это ошибка в тексте, или я неправильно понимаю различие между скалярным UDF и табличным UDF?