Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表值函数,设置变量_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 表值函数,设置变量

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

我正在处理表值函数,我需要一些帮助。下面是我得到的,但是看起来Table value函数不喜欢在RETURN语句中声明任何变量

正如您所看到的,我使用Declare/Set变量捕获列名,但它似乎不适用于表值

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

谢谢,

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。