【问题标题】:How to insert dynamic pivot output result into temp table in SQL server?如何将动态数据透视输出结果插入到 SQL Server 的临时表中?
【发布时间】:2019-04-01 08:54:15
【问题描述】:

我已经尝试了以下所有链接,但它们在我的 Sever SQL 中不起作用?

SET @cols = STUFF((SELECT ',' + QUOTENAME(AD.MonthFormat) FROM #tempMonthFormat AD FOR xml PATH (''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
  SELECT @Selectcols =  STUFF((SELECT 
    ',' + ISNULL(@Selectcols + ',','')+ 'ISNULL(' + QUOTENAME(AD.MonthFormat) + ', 0) AS ' + QUOTENAME(AD.MonthFormat)  FROM #tempMonthFormat AD 
  FOR xml PATH (''), TYPE)
  .value('.', 'nvarchar(max)'), 1, 1, '');

Declare @FINALQUERY varchar(max);    
SET @FINALQUERY = '         
                      SELECT  Name,[Issue],' + @Selectcols + ' FROM
                     (
                         SELECT   into #temptable * FROM #Meantimeresult  
                     ) Y
                     PIVOT 
                     (
                         SUM(MT)
                         FOR [Monthformat] IN (' + @cols + ')               
                    ) p GROUP BY ' + @cols+',[Issue], Name'                

        EXEC SP_EXECUTESQL @FINALQUERY;

Dynamic SQL Result INTO #Temp Table

How to create temp table from a dynamic query?

INSERT INTO temp table from unknown number and name of columns (from dynamic PIVOT query) Dynamic Pivot Results to a Temp Table

【问题讨论】:

  • @Selectcols、@cols 的定义?
  • 我已经提供了 -Selectcols 和 -cols 的定义
  • “不工作”不是有用的评论。您尝试过哪些具体不起作用的方法?你怎么知道 - 你收到错误了吗?还有什么?没有人能读懂你的想法。

标签: sql-server tsql pivot-table


【解决方案1】:

可以通过几个步骤来完成,但是这个答案的复杂性质应该向您表明您在这里与 sql server 作斗争,而不是与它作斗争。努力寻找另一种方式来构建您的报告,以便在采取此类严厉措施之前不必这样做。

1) 将您的初始数据透视查询封装/破解为无参数存储过程。如果您需要将任何数据传递到过程中,您必须 将其构建为 global 临时表(## 前缀临时表),例如

CREATE PROCEDURE dynamic_meantime_pivot AS
DECLARE 
    @cols nvarchar(max) = STUFF(
        (SELECT ',' + QUOTENAME(AD.MonthFormat) FROM ##tempMonthFormat AD FOR xml PATH (''), TYPE)
        .value('.', 'nvarchar(max)'), 1, 1, '')
    @Selectcols nvarchar(max) = STUFF(
        (SELECT ',' + ISNULL(@Selectcols + ',','')+ 'ISNULL(' + QUOTENAME(AD.MonthFormat) + ', 0) AS ' + QUOTENAME(AD.MonthFormat)  FROM ##tempMonthFormat AD FOR xml PATH (''), TYPE)
        .value('.', 'nvarchar(max)'), 1, 1, '');

Declare @FINALQUERY varchar(max) = '         
                      SELECT  Name,[Issue],' + @Selectcols + ' FROM
                     (
                         SELECT * FROM ##Meantimeresult  
                     ) Y
                     PIVOT 
                     (
                         SUM(MT)
                         FOR [Monthformat] IN (' + @cols + ')               
                    ) p GROUP BY ' + @cols+',[Issue], Name'                

EXEC(@FINALQUERY)

2) 设置上述过程所需的任何全局临时表。

3) 通过OPENROWSET函数调用过程如下:

SELECT * INTO #dynamic_meantime_table FROM OPENROWSET('SQLNCLI', 'Server=<your_sql_server_instance_name_here>;Trusted_Connection=yes;',
     'EXEC dynamic_meantime_pivot')

另请参阅有关 OPENROWSET 的出色答案。

Insert results of a stored procedure into a temporary table

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多