Как вы определяете скалярное значение UDF? - PullRequest
1 голос
/ 31 декабря 2011

Я читаю 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?

1 Ответ

1 голос
/ 31 декабря 2011

Есть разница.Посмотрите на предложение where в первом

   WHERE CustomerID = @CustomerID

Соответствует CustomerID одному единственному целочисленному значению (которое является параметром.)

Во втором предложении where

   WHERE CustomerID = soh.CustomerID

Соответствует каждому значению CustomerID в таблице Sales.SalesOrderHeader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...