Sql server SQL Server 2008,我可以在udf中的select语句中引用临时表吗?

Sql server SQL Server 2008,我可以在udf中的select语句中引用临时表吗?,sql-server,sql-server-2008,temp-tables,Sql Server,Sql Server 2008,Temp Tables,我试图在udf中的临时表上运行select查询。我找不到说明这是不允许的文档,但当我将tblDailyPricingAndVol更改为dailyPricingAndVolBySymbol时,下面的存储过程将不会编译,当然,这是我的临时表。临时表是在使用此函数的存储过程之前的存储过程的更高级别上创建的,如果这会影响任何内容。。。提前谢谢 编辑: udf只是调用它的存储过程的助手。。我试图用它查询一个临时表,因为它每次运行时都会被调用数千次。它检索并聚合的数据位于一个包含数百万行的表中。所以我把数据

我试图在udf中的临时表上运行select查询。我找不到说明这是不允许的文档,但当我将tblDailyPricingAndVol更改为dailyPricingAndVolBySymbol时,下面的存储过程将不会编译,当然,这是我的临时表。临时表是在使用此函数的存储过程之前的存储过程的更高级别上创建的,如果这会影响任何内容。。。提前谢谢

编辑: 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

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


不能从函数内访问临时表。我建议改为使用暂存表。为了更好地在数据库中组织这些内容,您可以创建一个名为Staging的模式,一个名为Staging.dailyPricingAndVolBySymbol的表,并从您的UDF中调用它。

正如其他海报所述,您不能在UDF中使用临时表。您可以做的是将a传递给函数

用户定义的表类型

在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
) ...

再次感谢。。。新手的后续问题,我是否在创建临时表的存储过程中创建表类型?@StatsViaCsh-我从未尝试过,但我怀疑这是否有效。不过尝试一下也没什么坏处。