我正在阅读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之间的区别?
答案 0 :(得分:1)
有区别。查看第一个
中的where子句 WHERE CustomerID = @CustomerID
将CustomerID
与单个整数值(这是一个参数)匹配。
在第二个where子句
WHERE CustomerID = soh.CustomerID
匹配CustomerID
表中Sales.SalesOrderHeader
的每个值。