【问题标题】:Table-Value Function, Set Variable表值函数,设置变量
【发布时间】:2014-02-25 12:21:06
【问题描述】:

我正在研究表值函数,我需要一些帮助。这是我得到的,但看起来 Table-value 函数不喜欢在 RETURN() 语句中声明任何变量。

如您所见,我正在捕获列名称(使用声明/设置变量),但它似乎不适用于值表值。

请告知另一种方法。如果可能,请提供一些示例代码。

谢谢,

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 函数中使用动态 SQL。

标签: sql sql-server tsql


【解决方案1】:

不幸的是,这不能使用 TVF 完成,因为 SQL 期望的是硬返回模式,而不是您所做的灵活模式。

你可以在 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 的 TVF 的固定模式的一个技巧是我返回一个 XML 列,您可以轻松地从中提取。另一种技术是硬编码固定数量的列,比如 10 个,标记为 A-J,每年都会在其中获取 TotalSO。
  • 或者你可以让它返回一个字符串并让调用者执行那个(超级黑客)
  • 虽然我不知道如何让它按照您的建议工作,但感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多