2015-06-05 2 views
0

У меня есть функция таблицы, которая содержит некоторые таблицы CTE, которые в конечном итоге сворачиваются к возвращаемому выражению select. В одной из таблиц CTE я использую @variable. Это тот же @variable, который я объявляю для функции. Когда я пытаюсь сохранить функцию, я получаю эту ошибку:cte tsql using переменная

Lookup Error - SQL Server Database Error: Parameters were not supplied for the function 'forecast_baseline'. 

Есть ли проблема с использованием @variable внутри таблицы КТР? Я могу предоставить код, но, похоже, он не передаёт функцию @variable в таблицу CTE, поэтому компилятору это не нравится.

ALTER function [eo].[forecast_baseline] (@monthkey as char(6)) 
    returns @results table(
    [billing_date] date, 
    [year] int, 
    [type] varchar(max), 
    [dollars] float, 
    [units] float, 
    [CC] int, 
    [offering] varchar(max), 
    [IntegratedReleasePlanNm] varchar(max), 
    [ProjectId] varchar(max), 
    [ProjectNm] varchar(max), 
    [ModelEstimateId] varchar(max), 
    [query] varchar(max), 
    [ItemGroupId] varchar(max), 
    CashflowType varchar(12), 
    plotdate datetime 
) 
    as 
    begin 
    declare @StartTime datetime = (SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(getdate())-1),getdate()),101)) 
    declare @EndTime datetime = DATEADD(year, +5, @StartTime) 
    declare @Interval int = 1; 

    WITH yearsinmonths (
     [datetimemonth], 
     [enddatetimemonth]) AS ( 
      SELECT 
      @StartTime datetimemonth, 
      DATEADD(month, @Interval, @StartTime) AS enddatetimemonth 
      UNION ALL 
      SELECT 
      EndRange, 
      DATEADD(month, @Interval, enddatetimemonth) 
      FROM 
      cSequence 
      WHERE 
      DATEADD(month, @Interval, enddatetimemonth) < @EndTime 
    ), 

    forecast_baseline (
     [billing_date], 
     [year], 
     [type], 
     [dollars], 
     [units], 
     [CC], 
     [offering], 
     [IntegratedReleasePlanNm], 
     [ProjectId], 
     [ProjectNm], 
     [ModelEstimateId], 
     [query], 
     [ItemGroupId], 
     [CashflowType]) as (
      select 
      dateadd(month,-1,convert(date, a.CHARGE_MONTH+'01', 112)) 
      ,year(dateadd(month,-1,convert(date, a.CHARGE_MONTH+'01', 112))) 
      ,'Baseline' 
      ,sum(cast(a.CHARGE_AMOUNT as money)) 
      ,sum(cast (PPGUNITS as float)) 
      ,ORG_CC 
      ,[offering] 
      ,'Baseline' 
      ,'baseline' 
      ,'baseline' 
      ,'baseline' 
      ,'baseline' 
      ,'N/A' 
      ,'N/A' 
      from 
      [sources].[feeds].[MARS2IEO_MARS_BD12_INV_LOB_EXTRACTS] a join sources.[md].[MARS_ITEMID_MAPPING] b 
       on a.offering=b.itemid 
      where 
      host_name is not null 
      and (a.org_sort_code like ('KBBFA%') or 
       a.org_sort_code like ('KBBFB%') or 
       a.org_sort_code like ('KBBDD%')) 
      and b.category in ('server','disk','tape') 
      and cast(year(dateadd(month,-1,convert(date,  a.CHARGE_MONTH+'01', 112))) as char(4)) + RIGHT('00' + CONVERT(VARCHAR,month(dateadd(month,-1,convert(date, a.CHARGE_MONTH+'01', 112)))), 2) <= @monthkey -- this is the line that throws the error 
      group by 
      offering 
      ,ORG_CC 
      ,dateadd(month,-1,convert(date, a.CHARGE_MONTH+'01', 112)) 
      ,year(dateadd(month,-1,convert(date, a.CHARGE_MONTH+'01', 112))) 
) 

    INSERT INTO @results (
     [billing_date], 
     [year], 
     [type], 
     [dollars], 
     [units], 
     [CC], 
     [offering], 
     [IntegratedReleasePlanNm], 
     [ProjectId], 
     [ProjectNm], 
     [ModelEstimateId], 
     [query], 
     [ItemGroupId], 
     [CashflowType] 
    ) 
     select 
     * 
     from 
     forecast_baseline 

    INSERT INTO @results (
     [billing_date], 
     [year], 
     [type], 
     [dollars], 
     [units], 
     [CC], 
     [offering], 
     [IntegratedReleasePlanNm], 
     [ProjectId], 
     [ProjectNm], 
     [ModelEstimateId], 
     [query], 
     [ItemGroupId], 
     CashflowType 
    ) 
     SELECT 
     b.datetimemonth 
     ,year([billing_date]) 
     ,'Baseline' 
     ,[dollars] 
     ,[units] 
     ,CC 
     ,[offering] 
     ,'Baseline' 
     ,'projected' 
     ,'projected' 
     ,'projected' 
     ,'projected' 
     ,'N/A' 
     ,'N/A' 
     FROM 
     forecast_baseline a inner join yearsinmonths b 
      on cast(year([billing_date]) as char(4))+ RIGHT('00' + CONVERT(VARCHAR,month([billing_date])), 2) = @monthkey 
     and b.datetimemonth > [billing_date] 
     return 
    end 
+1

Да, укажите код –

+0

добавленный код. проблема заключается в ** прогнозе_бассейн ** cte. он ищет параметр, который не распознает параметр @monthkey в качестве параметра. Я должен иметь переменную там, потому что таблица, из которой этот cte тянет, слишком велика, чтобы загрузить все это. производительность будет бак. –

ответ

2

Ошибка в том, что вы назвали CTE в качестве имени вашей функции. Изменение второй CTE имени:

... 
WHERE 
DATEADD(month, @Interval, enddatetimemonth) < @EndTime 
), 

forecast_baseline (
... 

к любому другому имени.

Также вам нужно будет использовать UNION ALL вместо отдельных вставок в таблице результатов, потому что у вас есть только 1 возможность запросить CTE. Вы не можете запросить CTE несколько раз.

+0

ничего себе. хороший улов. что мне даже не приходило в голову. он должен был ... Я возвращался, не осознавая этого. Спасибо огромное! –

+0

@ M.Ford, добро пожаловать –

Смежные вопросы