2016-10-03 94 views
0

我正在使用存储过程创建SSRS报告。存储过程可以动态旋转几次。中间表的模式是动态的,因此我使用临时表。由于该过程使用动态旋转,因此我也少用动态SQL;因此不能在我的脚本中使用本地临时表。存储过程运行正常;但是当同一个存储过程嵌入到SSRS查询设计器中时,它会给出全局临时表已经存在的错误。更不用说,我将它们全部放到代码中。SQL Server 2012 SSRS:使用全局临时表创建报告

请找代码:

USE [IGD_HISTORY_COMBINED] 
GO 
/****** Object: StoredProcedure [dbo].[USP_GETIGDDETAILS] Script Date: 03-10-2016 12:05:46 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[USP_GETIGDDETAILS] @ID CHAR(17) ,@YEAR INT=null 
AS 
BEGIN 




--declare @ID CHAR(17) 
--set @id='1208700418b8b9c44' 



SELECT id, floodzone, FloodzoneLastUpdatedDate, versionid INTO ##HIST 
FROM IGD_HISTORY_MONROE 
WHERE [email protected] and floodzone is not null and RecordStatus='U' 
--and VersionId BETWEEN 587 AND 748 
ORDER BY VERSIONID desc 

Select *, 'VERSION_'+ cast(ROW_NUMBER() over (order by VERSIONID) AS varchar) 
as New_VERSION into ##temp from ##HIST ORDER BY VERSIONID ASC 


--Dynamic Pivoting in order to put the Id and versionid values relational 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
+ QUOTENAME(New_VERSION) 
FROM (SELECT DISTINCT New_VERSION FROM ##temp) AS Courses 



--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
N'select * into ##Final from (SELECT ID, FLOODZONE, New_Version' +' 
FROM ##Temp)SRC 
PIVOT(MAX(FLOODZONE) 
FOR New_vERSION IN (' + @ColumnName + ')) AS PVTTable' 


EXEC (@DynamicPivotQuery) 


select a.*,b.ParcelIDActual, b.PropertyLocationStreet1,b.PropertyLocationStreet2, 
b.PropertyCity,b.PropertyZip, B.CountyName 
INTO ##CE 
from ##Final a 
join IGD_DEV_2012..igd b 
on a.id=b.id; 

select * from ##CE; 


WITH CTE_New as (
select 
case when right (C.SourceFileName,8) like '[0-9]%' 
Then C.SourceFileName 
When right (C.SourceFileName,8) not like '[0-9]%' 
Then c.SourceFileName + '_'+ replace(cast(cast(C.CompletedTime as date) as varchar),'-','') 
end as SourceFileName, 
c.SourceVersion, 
'Version_'+SourceVersion as Version1 
from 
(select distinct versionid from ##temp) D 
join igd_datasourcestatus C 
on d.versionid=c.SourceVersion 
) 
select VERSION1 +': '+upper(SourceFileName) as Version_information into ##version_info from CTE_New; 





DECLARE @DynamicPivotQuery1 AS NVARCHAR(MAX) 
DECLARE @ColumnName1 AS NVARCHAR(MAX); 


SELECT Version_information , 'VERSION'+ CAST(ROW_NUMBER() OVER (ORDER BY Version_information) AS varchar) vERSIONS 
INTO ##TE 
FROM ##version_info 


--Get distinct values of the PIVOT Column 
SELECT @ColumnName1= ISNULL(@ColumnName1 + ',','') 
+ QUOTENAME(VERSIONS) 
FROM (SELECT DISTINCT VERSIONS FROM ##TE) AS Courses 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery1 = 
N'select * into ##Final1 from (SELECT Version_information, versions' +' 
FROM ##TE)SRC 
PIVOT(MAX(version_information) 
FOR versions IN (' + @ColumnName1 + ')) AS PVTTable' 


EXEC sp_executesql @DynamicPivotQuery1 

truncate table new1 


SELECT A.*,B.* 
into ##TEMPO 
FROM ##CE A 
JOIN ##FINAL1 B 
ON A.ID = @ID 


if exists (select max(versions) from ##te having max(versions)='version7') 
begin 
insert new1 ([id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 
     ,[version6] 
     ,[version7] 
     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 
     ,[version_6] 
     ,[version_7]) 
select [id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 
     ,[version6] 
     ,[version7] 
     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 
     ,[version_6] 
     ,[version_7] 
     from ##TEMPO 
end 

if exists (select max(versions) from ##te having max(versions)='version6') 
Begin 
    insert new1 ([id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 
     ,[version6] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 
     ,[version_6] 
    ) 
select [id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 
     ,[version6] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 
     ,[version_6] 

     from ##TEMPO 
end 

if exists (select max(versions) from ##te having max(versions)='version5') 
Begin 
    insert new1 ([id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 
    ) 
select [id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 
     ,[version5] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 
     ,[Version_5] 

     from ##TEMPO 
end 

if exists (select max(versions) from ##te having max(versions)='version4') 
Begin 
    insert new1 ([id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 
     ,[version4] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 
     ,[VERSION_4] 

    ) 
select [id] 
     ,[version1] 
     ,[version2] 
     ,[version3], 
     [version4] 
    ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3], 
     [version_4] 
    from ##TEMPO 

end 


if exists (select max(versions) from ##te having max(versions)='version3') 
Begin 
    insert new1 ([id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 


     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 


    ) 
select [id] 
     ,[version1] 
     ,[version2] 
     ,[version3] 

     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 
     ,[VERSION_3] 

    from ##TEMPO 

end 

if exists (select max(versions) from ##te having max(versions)='version2') 
Begin 
    insert new1 ([id] 
     ,[version1] 
     ,[version2] 


     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 



    ) 
select [id] 
     ,[version1] 
     ,[version2] 


     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 
     ,[VERSION_2] 


    from ##TEMPO 

end 


if exists (select max(versions) from ##te having max(versions)='version1') 
Begin 
    insert new1 ([id] 
     ,[version1] 



     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 




    ) 
select [id] 
     ,[version1] 
     ,[ParcelIDActual] 
     ,[PropertyLocationStreet1] 
     ,[PropertyLocationStreet2] 
     ,[PropertyCity] 
     ,[PropertyZip] 
     ,[CountyName] 
     ,[VERSION_1] 


    from ##TEMPO 

end 









Drop table ##TEMPO 
drop table ##Final 
DROP TABLE ##CE 
DROP TABLE ##HIST 
DROP TABLE ##TE 
DROP TABLE ##temp 
DROP TABLE ##version_info 
DROP TABLE ##Final1 



select * from NEW1 


END 
+0

可能是报告并行运行? – TheGameiswar

+0

你的意思是,没有多重连接? –

+0

我只在查询设计器中出现错误,在初始阶段 –

回答

0

有几个原因,这个代码是容易发生故障。

  1. 通过使用具有相同名称的全局临时表,此过程不能并行运行(不能有重叠的执行)。第二次迭代将尝试创建已经存在的表。
  2. 在没有错误处理的情况下放置DROP TABLE语句意味着如果此过程因任何原因失败,则DROP TABLE语句将不会全部执行,从而使临时表以下一次执行的方式执行。这就是抛出你所看到的错误。

,你可以做些什么来解决这个问题(因为你已经做动态SQL)为动态命名的表与在程序开始时确定一个单一的后缀,例如:

DECLARE @TableSuffix NVARCHAR(10)) 
SET @TableSuffix = CAST(ABS(CHECKSUM(NewId())) % 9999999999 AS NVARCHAR(10)); 

然后为每个表,钉在后缀:

SET @DynamicPivotQuery = 
N'select * into ##Final' + @TableSuffix + 
N' from 
    (SELECT ID, FLOODZONE, New_Version' +' 
    FROM ##Temp' + @TableSuffix + N')SRC 
    PIVOT(MAX(FLOODZONE) 
    FOR New_vERSION IN (' + @ColumnName + ')) AS PVTTable' 

你需要让每个全局临时表的创造活力。只要您不打开查询设计器的过程,SSRS应该可以使用动态SQL。绝对避免将过程的DDL作为内联报告SQL。