【发布时间】:2011-12-31 15:47:25
【问题描述】:
我正在阅读 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(与表值 UDF 相对)是返回单个值的 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 之间的区别?
【问题讨论】:
标签: sql sql-server sql-server-2008