你如何定义一个标量值的UDF?

时间:2011-12-31 15:47:26

标签: sql sql-server sql-server-2008

我正在阅读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;

他们将第二个例子与“使用内联表值UDF不会产生与使用标量UDF相同的性能损失”进行对比,因为......“

那么,第二个例子,即使代码与第一个代码相同,也是表值UDF而不是标量UDF?这是文本中的错误,还是我误解了标量UDF和表值UDF之间的区别?

1 个答案:

答案 0 :(得分:1)

有区别。查看第一个

中的where子句
   WHERE CustomerID = @CustomerID

CustomerID与单个整数值(这是一个参数)匹配。

在第二个where子句

   WHERE CustomerID = soh.CustomerID

匹配CustomerID表中Sales.SalesOrderHeader的每个值。