2012-02-18 5 views
1

私はudf内のテンポラリテーブルでselectクエリを実行しようとしています。私はこれが許可されていないことを示す文書を見つけることができませんが、tblDailyPricingAndVol#dailyPricingAndVolBySymbolに変更すると、以下のストアドプロシージャはコンパイルされません(テンポラリテーブルはもちろんです。 。それが何かに影響を与える場合、事前に感謝を...)この機能を使用するストアドプロシージャをSQL Server 2008では、udf内のselect文の一時テーブルを参照できますか?

編集: UDFはちょうどそれを呼び出すストアドプロシージャのヘルパーであることを意味している..私はしようとしていますそれが実行されるたびに何千回も呼び出されるという事実のために一時テーブルを照会することができます。取得して集計するデータは数百万行のテーブルにあります。 100レコードを一時テーブルに格納することができます。これにより、機能が大幅に高速化され、それでも実行するにはかなりの時間がかかります。

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

+0

+1はユーザ定義のテーブルタイプについて議論しています –

+0

@StatsViaCsh - 私はそれを試したことはありませんが、うまくいくかどうかは疑問です。しかし、それを試しても害はありません。 –

2

あなたは運が悪いようです。私は以下の簡単な関数を作成し、関数内の一時テーブルを参照できないという明示的なコンパイラメッセージを得ました。なぜUDF内の一時テーブルを参照する必要があるのか​​分かりませんが、それは実際にはUDFの精神ではありません。このUDFをどのように呼び出す予定であるかを示すことができますか?おそらく、私たちはそのリファクタリングを手伝うことができました。

enter image description here

+0

おかげである可能性があります。元の投稿を更新します。 – StatsViaCsh

+0

+1の簡単な例を示します。 –

2

一時テーブルは、関数内からアクセスすることができません。代わりにステージングテーブルを使用することをお勧めします。 DBでこれらを整理するには、Staging.dailyPricingAndVolBySymbolという名前のStagingというスキーマを作成し、それをUDFから呼び出すことができます。

+0

+1は有効な代替案を提案しています。 –

+0

@お寄​​せいただきありがとうございます。 – StatsViaCsh