2011-07-27 90 views
1

我需要完成在存储过程如下:选择动态列GROUP BY动态列

  1. 通参数列名。
  2. 选择参数化列名称并按选定列提供总分组。

代码:

CREATE PROCEDURE sproc (
    @column1 NVARCHAR(MAX), 
    @column2 NVARCHAR(MAX), 
    @startdate DATE, 
    @enddate DATE) AS 

BEGIN 

    DECLARE @sqlquery NVARCHAR(MAX) = 'SELECT @column1, @column2, SUM(amountcolumn) 
             FROM tablename 
             WHERE column3 = ''@value3'', 
              datecolumn BETWEEN ''@startdate'' AND ''@enddate'' 
            GROUP BY @column1, @column2'; 

    DECLARE @params NVARCHAR(MAX) = '@column1 VARCHAR(MAX), 
            @column2 VARCHAR(MAX), 
            @startdate DATE, 
            @enddate DATE'; 

    EXEC sp_sqlexec @sqlquery, @params, 
     @column1 = @column1, 
     @column2 = @column2, 
     @startdate = @startdate, 
     @enddate = @enddate; 

END 

GO 
+0

@ value3从哪里来? –

+0

这个动态sql被内置到将被ssrs报告使用的sproc中。 @ value3是逗号分隔的多选值,它作为字符串参数传递给sproc。 –

+0

So @ value3是一个字符串列表,或者是一个整数列表,或者是一个恰好是逗号分隔值列表的单个字符串值?你能举一个这个以逗号分隔的字符串和第3列数据的例子吗?我建议你在开始尝试动态构建它之前,先在Management Studio中获得一个实际的查询(你的语法目前有几种错误)。 –

回答

1

假设@值3是一个字符串,是另一个参数的存储过程,即datecolumn其实DATE,并忽略了一个事实,我不知道如何可以有在分组字段可以是随机这样的(这你近期发生的其他问题,忽略在这里)的模式:

DECLARE @sql NVARCHAR(MAX) = N'SELECT ' 
    + @column1 + ', ' + @column2 + ', SUM(amountcolumn) 
    FROM tablename 
    WHERE column3 = ''' + @value3 + ''' 
    AND datecolumn BETWEEN ''' + CONVERT(CHAR(10), @startdate, 120) + ''' 
    AND ''' + CONVERT(CHAR(8), @enddate, 120) + ''' 
    GROUP BY ' + @column1 + ', ' + @column2 + ';'; 

EXEC sp_executesql @sql; 
    -- strongly recommend against sp_sqlexec 
    -- it is undocumented and unsupported 

这还假定您不关心顺序(你可能做,因此要添加ORDER BY以及GROUP通过)。