2014-02-24 3 views
0

Я работаю над функцией Table-Valued, и мне нужна помощь. Вот что я получил, но похоже, что функция table-value не любит объявлять какую-либо переменную внутри оператора RETURN().Функция табличного значения, заданная переменная

Как вы можете видеть, я собираю имя столбца (используя переменные Declare/Set), но, похоже, не работает значение value-value.

Просьба указать другой способ. Если возможно, предоставьте несколько примеров кодов.

Спасибо,

Alter FUNCTION getCompanySaleYears() 
RETURNS TABLE 
AS 
RETURN 
(
    -- //////// START: Get the Years and put them in the String for columns ///////// 
    Declare @StartYear INT, @EndYear INT, @sql VARCHAR(MAX) 
    Declare @StrYears varchar(max); 
    Set @StartYear = 2011; 
    SET @EndYear = Year(Getdate()); 

    SET @StrYears = '' 

    WHILE @StartYear <= @EndYear 
    BEGIN 
     SET @StrYears = @StrYears + ', [' + cast(@StartYear as varchar(10)) + ']' 
     SET @StartYear = @StartYear + 1 
    END 

    Select @StrYears = (SUBSTRING(@StrYears, 2, LEN(@StrYears))) 
    -- //////// START: Get the Years and put them in the String for columns ///////// 


    SET @sql = N' 
    SELECT CompanyID, ' + @StrYears + ' 
    FROM (
     SELECT CompanyID, SalesYear, SUM(TotalSO) AS TotalSO FROM (
      SELECT c.CompanyID, o.OrderID, YEAR(o.CreatedDate) AS SalesYear 
      , ISNULL((Select SUM(ExtQty * UnitSell) FROM dbo.OrderDetail WHERE OrderID = o.OrderID ), 0) AS TotalSO 
      FROM dbo.Company c 
      LEFT JOIN Order o ON o.CompanyID = c.CompanyID 
      WHERE 1 = 1 
      --AND c.CompanyID = o2.CompanyID 
      AND YEAR(o.CreatedDate) BETWEEN ''2011'' And Year(Getdate()) 

     ) z 
     GROUP BY CompanyID, SalesYear 
    ) x 
    PIVOT 
    (
     Sum(TotalSO) 
     FOR SalesYear 
     IN (
      ' + @StrYears + ' 
     ) 
    ) AS pvtSalesYear 
    ' 

    PRINT @sql 
    EXEC (@sql) 
) 
+1

FYI: Вы не можете использовать динамический SQL внутри функции SQL. – RBarryYoung

ответ

0

К сожалению, это не может быть сделано с помощью TVF, как SQL ожидает упорно возвращаются схемы, не гибкий один, как вы сделали.

Вы можете иметь переменные в ТВФ, вам просто нужен другой синтаксис

ALTER FUNCTION ...() RETURNS @t TABLE(CompanyID int, ...) AS BEGIN 
    INSERT @t(CompanyID,...) SELECT companyid,... FROM dbo.Company c LEFT JOIN... 
    RETURN; 
END; 
+0

Я в основном хочу динамически записывать годы, а затем добавлять эти столбцы для оператора select и pivot. Есть ли обходной путь для этого? – Milacay

+0

Обман, который я использовал для раздражающей фиксированной schemaness TVFs SQL, я возвращаю столбец XML, и вы можете легко извлечь из него. Другой метод заключается в жестком кодировании фиксированного количества столбцов, например 10, обозначенных A-J, которые получают TotalSO в них за каждый год. – Hafthor

+0

или у вас есть возможность вернуть строку и получить вызов EXEC, который (super hackey) – Hafthor

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