CREATE PROCEDURE GetGroups (
@Col1 bit,
@Col2 bit,
@Col3 bit,
@Col4 bit,
@Col5 bit,
@Col6 bit,
@Col7 bit,
@Col8 bit,
@Col9 bit,
@Col10 bit
)
AS
SELECT
COUNT = COUNT(*),
CASE @col1 WHEN 1 THEN COL1 END COL1,
CASE @col2 WHEN 1 THEN COL2 END COL2,
CASE @col3 WHEN 1 THEN COL3 END COL3,
CASE @col4 WHEN 1 THEN COL4 END COL4,
CASE @col5 WHEN 1 THEN COL5 END COL5,
CASE @col6 WHEN 1 THEN COL6 END COL6,
CASE @col7 WHEN 1 THEN COL7 END COL7,
CASE @col8 WHEN 1 THEN COL8 END COL8,
CASE @col9 WHEN 1 THEN COL9 END COL9,
CASE @col10 WHEN 1 THEN COL10 END COL10
FROM YourTable
GROUP BY
CASE @col1 WHEN 1 THEN COL1 END,
CASE @col2 WHEN 1 THEN COL2 END,
CASE @col3 WHEN 1 THEN COL3 END,
CASE @col4 WHEN 1 THEN COL4 END,
CASE @col5 WHEN 1 THEN COL5 END,
CASE @col6 WHEN 1 THEN COL6 END,
CASE @col7 WHEN 1 THEN COL7 END,
CASE @col8 WHEN 1 THEN COL8 END,
CASE @col9 WHEN 1 THEN COL9 END,
CASE @col10 WHEN 1 THEN COL10 END
ОБНОВЛЕНИЕ
Кстати, поскольку результирующий запрос не создается динамически, вы можете реализовать его как табличную функцию:
CREATE FUNCTION fnGetGroups (
@Col1 bit,
@Col2 bit,
@Col3 bit,
@Col4 bit,
@Col5 bit,
@Col6 bit,
@Col7 bit,
@Col8 bit,
@Col9 bit,
@Col10 bit
)
RETURNS TABLE
AS
RETURN (
SELECT
…
)
и вызовите его вместо этого из SP:
CREATE PROCEDURE GetGroups (
@Col1 bit,
@Col2 bit,
@Col3 bit,
@Col4 bit,
@Col5 bit,
@Col6 bit,
@Col7 bit,
@Col8 bit,
@Col9 bit,
@Col10 bit
)
AS
SELECT *
FROM fnGetGroups(@Col1, @Col2, @Col3, @Col4, @Col5,
@Col6, @Col7, @Col8, @Col9, @Col10)
Дело в том, что TVF может быть удобнее использовать в различных сценариях SQL, в то время как SP может быть предпочтительнее для вызова непосредственно из приложения..