从数据透视SQL Server动态检索数据

时间:2018-09-17 06:09:14

标签: asp.net sql-server web-services pivot

Asmx代码:

            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                HBPivot_cs thpivot = new HBPivot_cs();
                thpivot.EMPLOYEEID = rdr["EMPLOYEEID"].ToString();
                thpivot.FIRSTDATE = rdr["06/26/2018"].ToString();
                thpivot.SECONDDATE = rdr["06/27/2018"].ToString();
                listhbpivot.Add(thpivot);
            }
            con.Close();

我的数据: 此数据来自Pivot

EMPLOYEEID     06/26/2018     06/27/2018     06/28/2018     06/29/2018
1              07:00 AM       08:00 AM       07:30 AM       10:00 AM
2              07:01 AM       08:20 AM       07:10 AM       06:00 AM

字段名是动态的...我如何使用rdr.read检索它 谢谢

1 个答案:

答案 0 :(得分:0)

  1. 在您的sql服务器数据库中创建以下存储过程。

    create procedure dbo.EmploeeDynamicPivot
    as
    begin
    
        set nocount on;
    
        declare
            @columns    as nvarchar(max),
            @query      as nvarchar(max)
    
        select
            @columns    =
            stuff
            ((
                    select
                    distinct
                        ',' + quotename([your_date_column]) 
                    from
                        [your_table]
                    for xml path(''), type
            ).value('.', 'nvarchar(max)'), 1, 1, '')
    
    
        set @query =
        'select
            EMPLOYEEID, ' + @columns + '
        from 
        (
            select
                EMPLOYEEID   ,
                [your_date_column]   ,
                [your_value_column]
            from
                [your_table]
        )
            sourceTable
        pivot 
        (
            sum([your_value_column])
            for [your_date_column] in (' + @columns + ')
        )
            pivotTable'
    
    
        execute(@query);
    
        set nocount off;
    
    end
    
  2. 通过以下代码编辑c#代码。

    var sqlConnection = new SqlConnection([your_connection_string]);
    
    sqlConnection.Open();
    
    var sqlCommand = sqlConnection.CreateCommand();
    
    sqlCommand.CommandType = CommandType.StoredProcedure;
    sqlCommand.CommandText = "EmploeeDynamicPivot";
    
    var rdr = sqlCommand.ExecuteReader();
    
    while (rdr.Read())
    {
        for (int i = 0; i < rdr.FieldCount; i++)
        {
            var value = rdr.GetString(i);
            or
            var value = rdr.GetValue(i);
    
            //do something... 
        }
    }
    ...