SQL Server 2008, могу ли я сослаться на временную таблицу в операторе выбора в формате udf? - PullRequest
1 голос
/ 18 февраля 2012

Я пытаюсь выполнить запрос на выборку для временной таблицы в формате udf.Я не могу найти документацию, утверждающую, что это не разрешено, но хранимая ниже процедура не будет компилироваться, когда я изменю 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

Ответы [ 3 ]

4 голосов
/ 18 февраля 2012

Как уже упоминалось другими авторами, вы не можете использовать временную таблицу в UDF. вы можете сделать, это передать пользовательскую таблицу в вашу функцию.

Определяемые пользователем типы таблиц

В 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
) ...
2 голосов
/ 18 февраля 2012

Временные таблицы не могут быть доступны из функции.Я предлагаю вместо этого использовать промежуточный стол.Чтобы лучше организовать их в вашей БД, вы можете создать схему с именем Staging, таблицу с именем Staging.dailyPricingAndVolBySymbol, и вызывать ее из своей UDF.

2 голосов
/ 18 февраля 2012

Похоже, вам не повезло.Я создал быструю функцию ниже и получил явное сообщение компилятора, в котором говорится, что вы не можете ссылаться на временные таблицы в функции.Я не уверен, почему вам нужно ссылаться на временные таблицы в UDF, это не совсем дух UDF.Не могли бы вы показать, как вы планировали называть этот UDF?Может быть, мы могли бы помочь с этим рефакторингом.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...