临时表值为表值UDF

时间:2014-04-02 22:17:39

标签: tsql sql-server-2005

我在使用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'.

1 个答案:

答案 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。