2011-07-27 135 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通過)。