【问题标题】:SQL Server dynamic pivot as stored procedure using parametersSQL Server 动态数据透视作为使用参数的存储过程
【发布时间】:2015-11-12 04:58:13
【问题描述】:

我一直在努力在 SQL Server 中进行动态透视,用户可以在存储过程中调用并传递指定的参数,即:

 exec piv(schema, table, agg_type, aggCol, newCol)

我正在努力完成架构和表参数。

这是我目前所拥有的:

BEGIN

DECLARE @Piv AS NVARCHAR(max)  --final pivot. print this to see the exec statement
DECLARE @NewColumns AS NVARCHAR(max) -- extract data and format to make new columns
DECLARE @COLUMNS AS NVARCHAR(MAX) -- list of all columns to be used for CTE below
DECLARE @PivColumns AS NVARCHAR(MAX) --list of all columns except the 2 columns involved in pivot

--declaring parameters here for now

declare @aggCol nvarchar(max)
declare @newCol nvarchar(max)
declare @table nvarchar(max)
declare @schm nvarchar(max)

--To be used for parameters in the SP

set @schm = 'dbo'
set @table = 'Report'
set @aggCol = 'Flag'
set @newCol = 'Category'

-- extracts data and formats for new columns... here is where I'm stuck.
-- I have tried every way I can find to pass the variables in this statement and no luck

SELECT @NewColumns = COALESCE(@NewColumns + ',','') +   QUOTENAME(CATEGORY) + char(13)
FROM
(
SELECT DISTINCT Category  --needs to be dynamic ie: @newCol
FROM
dbo.Report  --needs to be dynamic ie: @table
) AS B


-- list of all columns to be used for CTE below

SELECT @Columns = COALESCE(@Columns + ',','') +   QUOTENAME(COLUMN_NAME) + char(13)
FROM
(
SELECT DISTINCT COLUMN_NAME
FROM
(
SELECT 
 SCHEMA_NAME(T.SCHEMA_ID) AS 'SCHEMA_NAME' -- GET THIS WORKING TO GET A SPECIFIC TABLE
,T.NAME AS 'TABLE_NAME'
,C.NAME AS 'COLUMN_NAME'
FROM SYS.COLUMNS C 
INNER JOIN SYS.TABLES T ON C.OBJECT_ID = T.OBJECT_ID
WHERE T.NAME = @table) AS A
) AS B
ORDER BY B.COLUMN_NAME


--list of all columns except the 2 columns involved in pivot

SELECT @PivColumns = 

COALESCE(@PivColumns + ',','') +   QUOTENAME(COLUMN_NAME) + char(13)
FROM
(
SELECT DISTINCT COLUMN_NAME
FROM
(
SELECT 
 SCHEMA_NAME(T.SCHEMA_ID) AS 'SCHEMA_NAME' -- GET THIS WORKING TO GET A SPECIFIC TABLE
,T.NAME AS 'TABLE_NAME'
,C.NAME AS 'COLUMN_NAME'
FROM SYS.COLUMNS C 
INNER JOIN SYS.TABLES T ON C.OBJECT_ID = T.OBJECT_ID
WHERE T.NAME = @table
and (C.name not like @aggCol or C.name not like @newCol)
) AS A
) AS B
ORDER BY B.COLUMN_NAME

--Removes columns that are used on the pivot

SET @PivColumns = REPLACE(REPLACE(@PivColumns,char(13)+',['+@aggcol+']',''),char(13)+',['+@newcol+']','')

--final statement to print/exec

SET @Piv ='
WITH T1 AS
(
SELECT 
'+@COLUMNS+'
FROM 
 '+@table+'
)

SELECT 
       '+@PivColumns+'
      ,'+@NewColumns+'
FROM T1
PIVOT
(MAX(FLAG) FOR CATEGORY IN ('+@NewColumns+'))AS PIV'

print(@Piv)
END

随意添加建议或以任何方式编辑,即:tempTable、cte 等...

我在另一个窗口中构建了它,可以得到我需要的东西,但我认为我不能在第一个语句中使用它:

BEGIN

DECLARE @NewColumns AS NVARCHAR(max)
declare @newCol nvarchar(max)
declare @table nvarchar(max)

set @newCol = 'Category'
set @table = '[dbo].[REPORT]'
Select @NewColumns = 
'
DECLARE @NewColumns AS NVARCHAR(max)
declare @table nvarchar(max)

SELECT @NewColumns = COALESCE(@NewColumns + '','','''') +   QUOTENAME(CATEGORY) + char(13)

FROM
(
SELECT DISTINCT '+@newCol+'
FROM
'+@table+'
) AS B
print(@NewColumns)
'
exec(@NewColumns) 
end

【问题讨论】:

    标签: sql-server stored-procedures dynamic parameters


    【解决方案1】:

    试试这个

        DECLARE @SQL VARCHAR(MAX)
        DECLARE @List VARCHAR(MAX)
        DECLARE @SQLList nVARCHAR(MAX)
    
        SET @SQLList=N'select @List=stuff((SELECT DISTINCT '',''+AccountType FROM '+@table+'. FOR XML PATH('''')),1,1,'''')'
        exec sp_executesql  @SQLList ,N'@List VARCHAR(MAX) out', @List out
        select @List
        SET @SQL=
        '
        SELECT * FROM (SELECT '+@newCol +','+@aggCol+'  
            FROM '+@table+') AS SourceTable
        PIVOT
        (
        '+@agg_type+'('+@aggCol+')
        FOR '+@newCol +'IN ('+@List+')
        ) AS PivotTable;'
      exec(@SQL)
    

    【讨论】:

    • 我试图把它的所有部分和部分都插入,但无法启动:(
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2014-10-16
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多