2015-11-11 170 views
3

我当SSMS跑,拉准确的数据,但是当我创建一个使用完全相同的查询SSRS的报告,它错过的是来自我用两个临时表的一个结果的查询。查询结果不同于SSRS结果

DECLARE @from int --= @fromparameter 
DECLARE @to int --= @toparameter 

/* 
For debug 
*/ 
set @from = 0 
set @to = 50 
/* 
================================================================================ 
Build a temp table with all accounts that have a move out date within params 
================================================================================ 
*/ 

IF OBJECT_ID('tempdb.dbo.#tempProperty', 'U') is not null drop table #tempProperty 
select 
    sa.spark_AccountNumber 
    ,sa.spark_PropertyIdName 
into 
    #tempProperty 
from 
    SparkCRM_MSCRM.dbo.spark_account sa 
where 
    sa.spark_AccountNumber IN (
           select distinct 
            sa.spark_AccountNumber 
            --,sa.spark_TenantMoveinDate 
            --,sa.CreatedOn 
            --,DATEDIFF(day,sa.spark_TenantMoveinDate,sa.CreatedOn) as [Difference] 
           from 
            SparkCRM_MSCRM.dbo.spark_account sa 
           where 
            sa.spark_TenantMoveinDate BETWEEN dateadd(DAY,@from,getdate()) AND dateadd(DAY,@to,getdate()) 
           ) 


/* 
================================================================================               
--create CTE with all accounts per property 
================================================================================ 
*/ 
--;with RowRanked (AccountNumber,Name,Rowrank,MoveinDate,MoveOotDate,SProperty,PProperty) 

--AS                                   
--( 
IF OBJECT_ID('tempdb.dbo.#temp', 'U') is not null drop table #temp                                  
    SELECT                                 
     sa.spark_AccountNumber [Account Number]                           
     ,sa.spark_name [Account Name] 
     ,ROW_NUMBER() OVER(PARTITION BY sa.spark_PropertyIDName ORDER BY COALESCE (sa.spark_TenantMoveinDate, sa.spark_agreementdate) DESC) [rowRank] 
     ,COALESCE (sa.spark_TenantMoveinDate, sa.spark_agreementdate) [Tenant Move In Date] 
     ,sa.spark_TenantMoveoutDate [Tenant Move Out Date] 
     ,sa.spark_PropertyIdName [Property ID] 
     ,p.spark_name [Property Name] 
    into #temp 
    FROM 
     SparkCRM_MSCRM.dbo.spark_property p 
    LEFT JOIN 
     SparkCRM_MSCRM.dbo.spark_account sa 
     on sa.spark_PropertyId = p.spark_propertyId 
    WHERE 
     sa.spark_PropertyIdName IN (SELECT spark_PropertyIdName from #tempProperty) 
--) 

/* 
================================================================================ 
build final dataset 
================================================================================ 
*/ 
select distinct 
    sa.spark_AccountNumber      [Account Number] 
    ,sa.spark_name        [Name] 
    ,concat (
      sa.spark_HouseNumber ,' ', 
      sa.spark_HouseName ,' ', 
      sa.spark_Address1 ,' ', 
      sa.spark_Address2 ,' ', 
      sa.spark_Address3 ,' ', 
      sa.spark_Address4 ,' ', 
      sa.spark_Postcode 
      )         [Address] 
    ,sa.spark_Email        [Email]   
    ,sa.spark_HomePhone       [Landline] 
    ,sa.spark_Mobile       [Mobile Number] 
    ,COALESCE(a3.Name,a2.Name,a1.Name)   [Letting Agent Partner] 
    ,sa.spark_tariffidName      [Tariff] 
    ,sa.spark_PPMTariffName      [PPM Tariff] 
    ,pm.Option_Label       [Payment Method] 
    ,sa.spark_Balance       [Account Balance] 
    ,sa.spark_IntendedMoveOut     [Date of Likely Move Out] 
    ,sa.spark_TenantMoveoutDate     [Current Tenant Move Out Date] 
    ,rr.[Account Number]      [New Account Number] 
    ,rr.[Tenant Move In Date]     [New Account Move In Date] 

    ,case 
     when pc.spark_CallDriver is not null 
      then 'Yes' 
     else 
      'No' 
    end           [Arrangement to Pay] 
    ,ds.Option_Label       [Stops] 

from 
    SparkCRM_MSCRM.dbo.spark_account sa 
--inner join 
-- DBS.dbo.Meter m  
-- on m.cust_ref = sa.spark_AccountNumber collate DATABASE_default 
-- and m.meter_status = 2 
left join 
    SparkCRM_MSCRM.dbo.spark_property sp 
    on sp.spark_propertyid = sa.spark_propertyid 

left join 
    SparkCRM_MSCRM.dbo.account a1    --branch 
    on sp.spark_PartnerId = a1.accountid 

left join 
    SparkCRM_MSCRM.dbo.account a2    --brand 
    on a1.parentaccountid = a2.accountid 

left join 
    SparkCRM_MSCRM.dbo.account a3    --partner 
    on a2.parentaccountid = a3.accountid 

left join  
    SparkCRM_Custom.dbo.GetCRMOptions('spark_account', 'spark_paymentmethod') pm 
    ON pm.Option_Value = sa.spark_paymentmethod 
left join 
    SparkCRM_Custom.dbo.GetCRMOptions('spark_account','spark_DebtorStatus') ds 
    on ds.Option_Value = sa.spark_DebtorStatus 
left join 
    SparkCRM_MSCRM.dbo.PhoneCall pc 
    on pc.spark_Account = sa.spark_accountId 
    and pc.spark_CallDriver = 101 
left join 
    #temp rr 
    on rr.[Property ID] = sa.spark_PropertyIdName 
    and rr.Rowrank = 1 

where 
    coalesce(
     sa.spark_IntendedMoveOut 
     ,sa.spark_TenantMoveoutDate 
     ) 
    BETWEEN 
     dateadd(DAY,@from,getdate()) AND dateadd(DAY,@to,getdate()) 

and 
    sa.spark_name not like '%occupier%' 

这当我运行在SQL Server Management Studio中的查询,但其复制到SSRS报表生成器似乎移除#temp表任何结果返回的数据。您会注意到我最初使用CTE作为第二张表,但我尝试使用临时表,而不是SSRS与CTE一起挣扎。

任何帮助将不胜感激!

+0

您是否尝试过使用SQL事件探查器捕获查询SSRS实际执行完全一样独立SSMS中运行查询? – Aquillo

+0

我还没有尝试过,这真的很有帮助,谢谢。我会给它一个去看看它带领我的地方。我感谢您的帮助! – Fabian0510

回答

2

您应该避免使用#TEMP表中报告服务,如果没有其他原因,它会引起各种各样的麻烦,如果人们尝试同时运行报告。

这将是更好地为您而是创建一个存储过程,你的报告可以调用。这将允许您根据需要申请指标和其他性能改装,然后它会

+0

非常好,谢谢乔纳斯。 碰巧,该报告现已返回相同的数据时SSMS跑了,尽管没有更改查询或报告文件。 我经常在想什么嵌入查询VS调用存储过程是带来的好处;感谢您的建议。 – Fabian0510

+0

我没有赞誉的声望,但我已经接受了答案!再次感谢。 – Fabian0510

+0

报表生成器也将缓存其结果,直到对数据集进行更改,因此即使在普通查询中也不会始终匹配SSMS。 – bushell