我在使用SQL 2k sproc时遇到了一些问题,我们将其转移到SQL 2k5,因此我们可以使用Table Value UDF而不是Scalar UDF。
这是简化的,但这是我的问题。
我有一个临时表,我填写了产品信息。然后,我将该产品信息传递给UDF,并将信息返回给我的主结果集。它似乎不起作用。
我是否不允许将临时表值传递给CROSS APPLY&#39表值UDF?
--CREATE AND FILL #brandInfo
SELECT sku, upc, prd_id, cp.customerPrice
FROM products p
JOIN #brandInfo b ON p.brd_id=b.brd_id
CROSS APPLY f_GetCustomerPrice(b.priceAdjustmentValue, b.priceAdjustmentAmount, p.Price) cp
--f_GetCUstomerPrice uses the AdjValue, AdjAmount, and Price to calculate users actual price
当我为b.priceAdjustmentValue和b.priceAdjustmentAmount添加虚拟值时,它的效果很好。但是一旦我尝试加载临时表中的临时表值。
Msg 207, Level 16, State 1, Line 140
Invalid column name 'b.priceAdjustmentValue'.
Msg 207, Level 16, State 1, Line 140
Invalid column name 'b.priceAdjustmentAmount'.
答案 0 :(得分:0)
你试过了吗?
--CREATE AND FILL #brandInfo
SELECT sku, upc, prd_id, cp.customerPrice
FROM products p
JOIN #brandInfo b ON p.brd_id=b.brd_id
CROSS APPLY (
SELECT *
FROM f_GetCustomerPrice(b.priceAdjustmentValue, b.priceAdjustmentAmount, p.Price) cp
)
--f_GetCUstomerPrice uses the AdjValue, AdjAmount, and Price to calculate users actual price
为UDF提供正确的上下文以解析列引用?
编辑:
我在我的本地Northwind 2005数据库中构建了以下UDF:
CREATE FUNCTION dbo.f_GetCustomerPrice(@adjVal DECIMAL(28,9), @adjAmt DECIMAL(28,9), @price DECIMAL(28,9))
RETURNS TABLE
AS RETURN
(
SELECT Level = 'One', AdjustValue = @adjVal, AdjustAmount = @adjAmt, Price = @price
UNION
SELECT Level = 'Two', AdjustValue = 2 * @adjVal, AdjustAmount = 2 * @adjAmt, Price = 2 * @price
)
GO
并在以下查询中引用它而没有问题:
SELECT p.ProductID,
p.ProductName,
b.CompanyName,
f.Level
FROM Products p
JOIN Suppliers b
ON p.SupplierID = b.SupplierID
CROSS APPLY dbo.f_GetCustomerPrice(p.UnitsInStock, p.ReorderLevel, p.UnitPrice) f
您确定#brandInfo的定义是否定义了priceAdjustmentValue和priceAdjustmentAmount列?更重要的是,如果你把它放在你提到的存储过程中,是否存在#brandInfo表,而没有定义那些列?我知道#brandInfo是一个临时表,但如果它在您尝试创建存储过程时存在且缺少列,则解析引擎可能会被绊倒。奇怪的是,如果表根本不存在,解析引擎只是滑过缺失的表并为您创建SP。