Я работаю над функцией 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)
)
FYI: Вы не можете использовать динамический SQL внутри функции SQL. – RBarryYoung