【发布时间】: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