Sql 表值函数,设置变量
我正在处理表值函数,我需要一些帮助。下面是我得到的,但是看起来Table value函数不喜欢在RETURN语句中声明任何变量 正如您所看到的,我使用Declare/Set变量捕获列名,但它似乎不适用于表值 请建议另一种方法。如果可能,请提供一些示例代码 谢谢,Sql 表值函数,设置变量,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在处理表值函数,我需要一些帮助。下面是我得到的,但是看起来Table value函数不喜欢在RETURN语句中声明任何变量 正如您所看到的,我使用Declare/Set变量捕获列名,但它似乎不适用于表值 请建议另一种方法。如果可能,请提供一些示例代码 谢谢, Alter FUNCTION getCompanySaleYears() RETURNS TABLE AS RETURN ( -- //////// START: Get the Years and put them in
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)
)
不幸的是,这不能像SQL所期望的那样使用TVF来完成,因为它们是硬返回模式,而不是您所做的灵活模式 您可以在TVF中使用变量,只需使用其他语法即可
ALTER FUNCTION ...() RETURNS @t TABLE(CompanyID int, ...) AS BEGIN
INSERT @t(CompanyID,...) SELECT companyid,... FROM dbo.Company c LEFT JOIN...
RETURN;
END;
我基本上希望动态捕获年份,然后为select和pivot语句添加这些列。有解决方法吗?我在SQL的TVFs的恼人的固定模式中使用的一种方法是返回一个XML列,您可以很容易地从中提取。另一种技术是硬编码固定数量的列,比如10列,标记为a-J,以获取每年的总数。或者,你可以让它返回一个字符串,让调用方执行,尽管我不知道如何使它按照你的建议工作,感谢您的回复。仅供参考:您不能在SQL函数中使用动态SQL。