2013-01-17 134 views
0

工作在sql server上。写一个关键sql,bellow是我的表和关键sql语法。我的问题是没能把这个关键值放在Temp表中。方式把pivote sql结果放到temptable

-----------------Table-1------------- 
CREATE TABLE Table1 (ColId INT,ColName VARCHAR(10)) 
INSERT INTO Table1 VALUES(1, 'Country') 
INSERT INTO Table1 VALUES(2, 'MONTH') 
INSERT INTO Table1 VALUES(3, 'Day') 



----------------Table-2---------------------------- 

CREATE TABLE Table2 (tID INT,ColID INT,Txt VARCHAR(10)) 

INSERT INTO Table2 VALUES (1,1, 'US') 
INSERT INTO Table2 VALUES (1,2, 'July') 
INSERT INTO Table2 VALUES (1,3, '4') 
INSERT INTO Table2 VALUES (2,1, 'US') 
INSERT INTO Table2 VALUES (2,2, 'Sep') 
INSERT INTO Table2 VALUES (2,3, '11') 
INSERT INTO Table2 VALUES (3,1, 'US') 
INSERT INTO Table2 VALUES (3,2, 'Dec') 
INSERT INTO Table2 VALUES (3,3, '25') 


-------------- 
----------------Pivotal sql---------------------------- 

DECLARE @query NVARCHAR(4000) 
DECLARE @cols NVARCHAR(2000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t2.ColName 
         FROM Table1 AS t2 
         ORDER BY '],[' + t2.ColName 
         FOR XML PATH('') 
        ), 1, 2, '') + ']'      

SET @query = N'SELECT tID, '+ 
@cols +' 
FROM 
(SELECT t2.tID 
     , t1.ColName 
     , t2.Txt 
FROM Table1 AS t1 
     JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p 
PIVOT 
(
MAX([Txt]) 
FOR ColName IN 
('+ 
@cols +') 
) AS pvt 
ORDER BY tID;' 
EXECUTE(@query) 

执行波纹管命令后要使用此值工作的休息,所以我需要把这个命令的结果值在临时表

EXECUTE(@query) 

回答

0

如果你能够用EXECUTE(@Querys)工作做你的程序的其他部分,你coud做这样的

Declare @TabName Varchar(40) 

Select @TabName='##'+Replace(CAST(NEWID() as Varchar(40)),'-','') 

DECLARE @query NVARCHAR(4000) 
DECLARE @cols NVARCHAR(2000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t2.ColName 
         FROM Table1 AS t2 
         ORDER BY '],[' + t2.ColName 
         FOR XML PATH('') 
        ), 1, 2, '') + ']'      

SET @query = N'SELECT tID, '+ 
@cols +' into ' [email protected] + ' 
FROM 
(SELECT t2.tID 
     , t1.ColName 
     , t2.Txt 
FROM Table1 AS t1 
     JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p 
PIVOT 
(
MAX([Txt]) 
FOR ColName IN 
('+ 
@cols +') 
) AS pvt 
ORDER BY tID;' 

Print @Query 
EXECUTE(@query) 

Select @query = 'Select * from ' + @Tabname 
EXECUTE(@query) 

Select @query = 'Drop Table ' + @Tabname 
EXECUTE(@query) 

的东西,如果你不想这样做,你可以使用一个“硬” ##可以使用,但是你不能在多用户环境下使用这种保存方式。

+0

bummi感谢您的回复,但这是一个多用户环境问题,因此无法使用全局# #temp表 – shamim

+0

@shamim多数民众赞成这就是为什么我从NEWID创建表名,这将强制您以相同的方式执行该过程的其余部分。填充查询并执行它。 – bummi

0

试试这个:

Declare @Sample table 
(
tID int, 
Country VARCHAR(10), 
Day int , 
MONTH VARCHAR(10) 
) 

Insert into @Sample 
EXECUTE(@query) 

select * from @Sample 

以相同的方式,您可以创建temp table而不是table variable并将其插入它

+0

praveen感谢您的回复,有一个问题,我无法创建临时表,因为我的Table1列增加很快,所以我需要更改此脚本为您定义的临时表,手动。这对我来说是一个大问题。帮助插入值在其列动态增长的临时动态表中 – shamim

+0

如果是这种情况,那么我发现你需要再次更改动态查询,如果列数发生变化 – praveen