我見過this,所以我知道如何使用動態生成的一組字段創建數據透視表。我現在的問題是,我想將結果放到臨時表中。將動態生成的數據透視表放入臨時表
我知道,爲了將結果集從EXEC語句中獲取到臨時表中,您需要預先定義臨時表。在動態生成數據透視表的情況下,無法事先知道這些字段。
我能想到得到這種類型的功能的唯一方法是使用動態SQL創建一個永久表。有沒有更好的辦法?
我見過this,所以我知道如何使用動態生成的一組字段創建數據透視表。我現在的問題是,我想將結果放到臨時表中。將動態生成的數據透視表放入臨時表
我知道,爲了將結果集從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
')
編輯:addded動態sql接受PARAMS到OPENQUERY
讓我嘗試的選擇這樣的解釋,而不是進。我也運行SQL Server 2005。因爲你有透視表我要去承擔相同或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
一個正常的選擇和選擇到之間的唯一不同的是,INTO #table一部分。
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
今天就遇到這個問題,併發布在我的blog。解決方案的簡短描述是創建一個包含一列的臨時表,然後使用sp_executesql動態更改它。然後你可以插入動態PIVOT的結果。下面的工作示例。
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? – brian 2009-04-22 16:39:12
你沒有。你也必須做出這種動態。 – 2009-04-22 16:43:15
不知道我理解了,請說明 – brian 2009-04-22 17:04:17