2015-11-11 2 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 Report Builder, кажется, чтобы удалить результаты из таблицы #temp. Вы заметите, что изначально я использовал CTE для второй таблицы, но вместо этого попытался использовать временную таблицу, если бы SSRS боролся с CTE.

Любая помощь была бы высоко оценена!

+0

Вы пытались использовать SQL Profiler для захвата запроса, который SSRS фактически выполняет? – Aquillo

+0

Я не пробовал это, это действительно полезно спасибо. Я отдам его и посмотрю, куда он ведет меня. Я ценю вашу помощь! – Fabian0510

ответ

2

Вам следует избегать использования #temp-таблиц в Reporting Services, если только по той причине, что это вызовет всевозможные проблемы, если люди попытаются запустить отчет одновременно.

Лучше для вас вместо этого создать хранимую процедуру, которую может вызвать ваш отчет. Это позволит вам применять индексы и другие изменения производительности по мере необходимости, и будет вести себя точно так же, как выполнение запроса автономно в SSMS.

+0

Отлично, спасибо Jonnus. Как это происходит, отчет теперь возвращает те же данные, что и при работе в SSMS, несмотря на отсутствие изменений в запросе или файле отчета. Я часто задавался вопросом, какие преимущества встраивания запроса или вызова SPROC были; Спасибо за ваш совет. – Fabian0510

+0

У меня нет репутации upvote, но я принял ответ! Еще раз спасибо. – Fabian0510

+0

Report Builder также будет кэшировать свои результаты до тех пор, пока изменения не будут внесены в набор данных, поэтому он не всегда будет соответствовать SSMS даже по обычным запросам. – bushell

Смежные вопросы