Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将动态生成的透视表获取到临时表中_Sql_Sql Server_Database_Pivot - Fatal编程技术网

Sql 将动态生成的透视表获取到临时表中

Sql 将动态生成的透视表获取到临时表中,sql,sql-server,database,pivot,Sql,Sql Server,Database,Pivot,我已经看到了,所以我知道如何使用动态生成的字段集创建透视表。我现在的问题是,我想把结果放到一个临时表中 我知道,为了从EXEC语句将结果集放入临时表中,需要预定义临时表。对于动态生成的透视表,无法事先知道字段 我能想到的获得此类功能的唯一方法是使用动态SQL创建一个永久表。有更好的方法吗?您可以这样做: -- add 'loopback' linkedserver if exists (select * from master..sysservers where srvname = 'loop

我已经看到了,所以我知道如何使用动态生成的字段集创建透视表。我现在的问题是,我想把结果放到一个临时表中

我知道,为了从EXEC语句将结果集放入临时表中,需要预定义临时表。对于动态生成的透视表,无法事先知道字段

我能想到的获得此类功能的唯一方法是使用动态SQL创建一个永久表。有更好的方法吗?

您可以这样做:

-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback')
    exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
    @srvproduct = N'',
    @provider = N'SQLOLEDB', 
    @datasrc = @@servername
go

declare @myDynamicSQL varchar(max)
select @myDynamicSQL = 'exec sp_who'
exec('
    select * into #t from openquery(loopback, ''' + @myDynamicSQL + ''');
    select * from #t
    ')

编辑:添加了动态sql以接受openquery的参数

让我尝试一下对select into的解释。我也在运行SQLServer2005。因为你们有数据透视表,所以我假设2008年也有同样的数据透视表

select 
    o.*,
    OtherField1,
    OtherField2
INTO #temp
FROM
    OriginalOtherData as ood
PIVOT (
    MAX([Value])
    FOR Field in (OtherField1, OtherField2)
) as piv
RIGHT OUTER join
    Original o on o.OriginalSD = piv.OriginalSD

select * from #temp
Drop table #temp
普通选择和选择到之间的唯一区别是选择到表格部分

对于查询,请从tablename中选择col1、col2、col3 col1变为行标签 col2成为列标题 col3是数据集

还可以去掉全局表

if OBJECT_ID('tempdb..#3') is not null drop table #3
if OBJECT_ID('tempdb..##3') is not null drop table ##3
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(   col2    ) from    tablename    FOR XML PATH(''), col2).value('.', 'NVARCHAR(MAX)'),1,1,'')
set @query = 'SELECT col1, ' + @cols + ' into ##3 from ( select col1, col2, col3 from tablename ) x  pivot (  max(col3)for col2 in (' + @cols + ')) p '
execute(@query)   
select * into #3 from ##3 if OBJECT_ID('tempdb..##3') -- is not null drop table ##3

今天遇到这个问题,并在我的网站上发布。解决方案的简短描述是创建一个包含一列的临时表,然后使用sp_executesql动态更改它。然后可以将动态轴的结果插入其中。下面是一个工作示例

CREATE TABLE #Manufacturers
(
    ManufacturerID INT PRIMARY KEY,
    Name VARCHAR(128)
)

INSERT INTO #Manufacturers (ManufacturerID, Name)
VALUES (1,'Dell')
INSERT INTO #Manufacturers (ManufacturerID, Name)
VALUES (2,'Lenovo')
INSERT INTO #Manufacturers (ManufacturerID, Name)
VALUES (3,'HP')

CREATE TABLE #Years
(YearID INT, Description VARCHAR(128))
GO

INSERT INTO #Years (YearID, Description) VALUES (1, '2014')
INSERT INTO #Years (YearID, Description) VALUES (2, '2015')
GO

CREATE TABLE #Sales
(ManufacturerID INT, YearID INT,Revenue MONEY)
GO

INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,2,59000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,2,46000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,2,111500000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,1,55000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,1,42000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,1,101500000000)
GO

DECLARE @SQL AS NVARCHAR(MAX)
DECLARE @PivotColumnName AS NVARCHAR(MAX)
DECLARE @TempTableColumnName AS NVARCHAR(MAX)
DECLARE @AlterTempTable AS NVARCHAR(MAX)

--get delimited column names for various SQL statements below
SELECT 
    -- column names for pivot
    @PivotColumnName= ISNULL(@PivotColumnName + N',',N'') + QUOTENAME(CONVERT(NVARCHAR(10),YearID)),
    -- column names for insert into temp table
    @TempTableColumnName = ISNULL(@TempTableColumnName + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)),
    -- column names for alteration of temp table
    @AlterTempTable = ISNULL(@AlterTempTable + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)) + ' MONEY' 
FROM (SELECT DISTINCT [YearID] FROM #Sales) AS Sales

CREATE TABLE #Pivot
(
     ManufacturerID INT
)

-- Thats it! Because the following step will flesh it out.

SET @SQL = 'ALTER TABLE #Pivot ADD ' + @AlterTempTable
EXEC sp_executesql @SQL

--execute the dynamic PIVOT query into the temp table 
SET @SQL =  N'
    INSERT INTO #Pivot (ManufacturerID, ' + @TempTableColumnName + ')
    SELECT ManufacturerID, ' + @PivotColumnName + '
    FROM #Sales S
    PIVOT(SUM(Revenue) 
      FOR S.YearID IN (' + @PivotColumnName + ')) AS PivotTable'
EXEC sp_executesql @SQL

SELECT M.Name, P.*
FROM #Manufacturers M
INNER JOIN #Pivot P ON M.ManufacturerID = P.ManufacturerID

如何将动态SQL传递给OPENQUERY?您没有。您也必须使其动态。我不确定是否理解,请澄清在这种情况下,t超出EXEC语句的范围。那么您可以将其放入全局临时表中。请阅读链接到的问题。我正在使用动态SQL为数据透视表生成字段列表。除非已经创建了表,否则不能对EXEC使用SELECT INTO。由于我不知道EXEC结果的字段列表,因此无法预创建表。您已经在动态生成字段列表。那么,为什么不使用该代码来帮助生成表定义呢?还有,是否有什么东西阻止MSSQL在EXEC内部而不是外部执行SELECT INTO操作?这两个问题的答案都是,在动态SQL查询中创建的临时表的范围将使发出EXEC调用的过程/查询无法访问它。当然,还有全局临时表。只需使用,而不是在名称中,但是您需要处理一个全局临时表。很好,一步一步完成案例研究。你的博客链接无论如何都不起作用。