2012-02-18 85 views
1

我想在udf中的临时表上运行选择查询。我找不到文档说明这是不允许的,但是当我将tblDailyPricingAndVol更改为#dailyPricingAndVolBySymbol(当然是我的临时表)时,下面的存储过程不会编译。临时表创建在更高级别(在存储过程中在提前使用此功能)如果影响什么...谢谢存储过程SQL Server 2008,我可以在udf中的select语句中引用临时表吗?

编辑: 的UDF意味着仅仅是调用它的存储过程的辅助...我试着使用它来查询一个临时表,因为它每次运行时会被调用几千次,它检索并聚合的数据在一个包含数百万行的表中,所以我将这些数据分成几个百个记录放入临时表中,这将大大提高功能,尽管它仍然需要一段时间才能运行。

ALTER FUNCTION dbo.PricingVolDataAvailableToDateProvided 
    (@Ticker nchar(10), 
    @StartDate DATE, 
    @NumberOfDaysBack int) 
    RETURNS nchar(5) 
AS 
    BEGIN 

    DECLARE @Result nchar(5) 
    DECLARE @RecordCount int 

    SET @RecordCount = (SELECT COUNT(TradeDate) AS Expr1 
     FROM (SELECT TOP (100) PERCENT TradeDate 
      FROM tblDailyPricingAndVol WHERE (Symbol = @Ticker) AND (TradeDate IN 
       (SELECT TOP (@NumberOfDaysBack) CAST(TradingDate AS DATE) AS Expr1 
        FROM tblTradingDays 
        WHERE (TradingDate <= @StartDate) 
        ORDER BY TradingDate DESC)) 
        ORDER BY TradeDate DESC) AS TempTable) 

    IF @RecordCount = @NumberOfDaysBack 
     SET @Result = 'True' 
    ELSE 
     SET @Result = 'False' 

    RETURN @Result 

    END 

回答

4

正如其他海报所提到的,您不能在UDF中使用临时表。你可以做的是通过User-Defined Table到你的功能。

用户定义的表类型

在SQL Server 2008,一个用户定义的表型是一个用户定义的类型 表示表结构的定义。您可以使用用户定义的表类型为存储的 过程或函数声明表值参数,或声明您希望 在批处理或存储过程或函数的主体中使用的表变量。

速战速决的改变你的代码可能是

CREATE TYPE DailyPricingAndVolBySymbolType AS TABLE (<Columns>) 
DECLARE @DailyPricingAndVolBySymbol DailyPricingAndVolBySymbolType 

INSERT INTO @DailyPricingAndVolBySymbol SELECT * FROM #DailyPricingAndVolBySymbol 

ALTER FUNCTION dbo.PricingVolDataAvailableToDateProvided (
    @DailyPricingAndVolBySymbol DailyPricingAndVolBySymbolType READONLY 
    @Ticker nchar(10), 
    @StartDate DATE, 
    @NumberOfDaysBack int 
) ... 
+0

再次感谢...新手后续问题,我是否创建临时表的存储过程中创建表类型? – StatsViaCsh 2012-02-18 17:12:59

+0

+1用于讨论用户定义的表类型 – 2012-02-18 17:31:19

+0

@StatsViaCsh - 我从来没有尝试过,但我怀疑这将工作。尽管如此,尝试它并没有什么坏处。 – 2012-02-18 18:25:56

2

看起来你运气不好。我在下面创建了一个快速函数,并得到一个显式的编译器消息,说你不能在一个函数中引用临时表。我不确定为什么你需要在UDF中引用临时表,这不是UDF的精神。你能说明你打算如何调用这个UDF吗?也许我们可以帮助重构。

enter image description here

+0

感谢。我会更新我的原始帖子。 – StatsViaCsh 2012-02-18 16:51:50

+0

+1提供一个简单的例子。 – 2012-02-18 17:06:47

2

温度表不能从函数内访问。我建议使用临时表代替。为了更好地组织这些数据,您可以创建一个名为Staging的模式,一个名为Staging.dailyPricingAndVolBySymbol的表,并从您的UDF中调用该模式。

+0

+1表示有效的替代方案。 – 2012-02-18 17:07:15

+0

@感谢您的建议。 – StatsViaCsh 2012-02-18 17:07:17

相关问题