2012-02-18 80 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

相關問題