另一种方法,我可以执行生成动态列的存储过程,可以在" in子句中提供给PIVOT"

时间:2017-05-15 12:23:16

标签: stored-procedures sql-server-2012 pivot sqlncli

我正在sql server management studio 2012中进行查询,它生成动态列,因为我们使用pivot将行转换为列。由于某些约束,我们无法使用存储过程来返回旋转结果集。 为了使用pivot实现动态列的相同结果集,我尝试了以下方法,但遇到了一些或其他问题。

  1. 使用视图,这里我们不能声明变量,因此我们不能拥有一个包含动态列的变量并将其传递给PIVOT。

  2. 使用表值函数。

  3. a)我们可以在函数中声明变量并在pivot中提供动态列的一种方法,需要将静态列指定为输出列。但我的查询会生成动态列。

    b)我们不能声明变量而不需要提及输出列的另一种方法显示在发布的示例中。在这里,我能够返回旋转的结果集,但正如我们提到的那样 声明变量我们无法在pivot中提供动态列。

    ALTER FUNCTION [dbo].[func_A] 
        ()
    RETURNS TABLE
    AS
    RETURN  
    (
        WITH cte AS
        (
           SELECT *
           FROM 
               (SELECT
                    DD.DesignId, DD.FactoryId, DD.DesignDescription, 
                    DD.OfferingTree, DD.LeadTime, DD.AvailableStatus, 
                    TS.ParameterValueFrom, TS.ParameterName 
                FROM
                    dbo.TechnicalSpecification AS TS 
                INNER JOIN 
                    DesignData AS DD ON TS.DesignId = DD.DesignId) ps
    PIVOT
    (
        MAX(ParameterValueFrom) 
        FOR ParameterName IN ( [**Bushing Family**])) AS pvt   
    )
    
    SELECT *
    FROM cte
    )
    

    粗体变量是我们需要提供动态列的地方。

    c)使用OpenRowSet的另一种方法如下所示

        SELECT * 
        INTO #MyTempTable 
        FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;', 'EXEC getBusinessLineHistory')
    

    这种方法说我们需要安装SQLNCLI。我们正在安装SQLNCLI。这种方法会起作用吗?

    有没有其他方法可以执行生成动态列的存储过程,可以在" in子句中提供给PIVOT"?

1 个答案:

答案 0 :(得分:0)

我能够使用SQLNCLI

执行存储过程

SELECT * FROM OPENROWSET('SQLNCLI','Server =(machinename); Trusted_Connection = yes;','EXEC procedurename'