2012-05-02 76 views
7

我在SSRS中運行以下查詢。如果我爲這兩個參數添加聲明,它在SQL管理控制檯中運行正常。如何列出來自SSRS數據集中動態SQL查詢的字段

declare @EMRQuery varchar(max) 
declare @CPSQuery varchar(max) 

set @EMRQuery = 'select Person.ExternalId 
        from ml.Person 
         join ml.Obs on Person.pId = Obs.pId 
          join ml.ObsHead on Obs.hdId = ObsHead.hdId 
        where ObsHead.name = ''SCHOOLREGDTE'' 
         and Obs.xId = 1.e+035 
         and Obs.change = 2 
         and Obs.obsDate >= to_date(''' 
          + convert(varchar(30), @DateYearStart, 120) 
          + ''', ''YYYY-MM-DD HH24:MI:SS'') 
         and Obs.obsDate < to_date(''' 
          + convert(varchar(30), @DateQuarterEnd, 120) 
          + ''', ''YYYY-MM-DD HH24:MI:SS'')' 

set @CPSQuery = 'select ic.ListName, count(distinct pp.patientprofileid) as PatCount 
        from PatientProfile pp 
         left join PatientInsurance pi on pp.PatientProfileId = pi.PatientProfileId 
           and pi.OrderForClaims = 1 
           and pi.Inactive <> 1 
          left join InsuranceCarriers ic on pi.InsuranceCarriersId = ic.InsuranceCarriersId 
         join OpenQuery(EMR_LIVE 
          , ''' + replace(@EMRQuery, '''', '''''') + 
         ''') Students on pp.PatientId = Students.ExternalId 
        group by ic.ListName ' 

exec(@CPSQuery) 

然而,當我插上這對SSRS,它不註冊,有可用於報告的任何領域。我如何說服SSRS確實有合適的領域?謝謝。

編輯:我剛剛宣佈在查詢的參數,它認識的字段名。

declare @DateYearStart datetime 
declare @DateQuarterEnd datetime 
set @DateYearStart = '2011-07-01' 
set @DateQuarterEnd = '2012-03-31' 

當然,那出錯的,因爲我聲明參數兩次,一次是作爲查詢參數,一次查詢中。但是,一旦我注意到上面的線條,我就再次失去了原野。

回答

4

有人在在MSDN論壇上建議我選擇到一個臨時表,所以我更換了最終的exec語句與

declare @CarrierList table (Listname varchar(200), PatCount int); 
insert @CarrierList exec(@CPSQuery) 
select * from @CarrierList 

,它似乎是現在的工作很好。

1

您的查詢可能有問題。 SSRS數據集可以評估您投入的任何內容。例如,我只是跑了這2個查詢一個小測試:

declare @a varchar(500) 
declare @b varchar(500) 
set @a = '(select name from sys.tables) B' 
set @b = 'select B.name as name2 from '[email protected] 
exec(@b) 

和我datase組確實承認領域名2。

我建議你檢查你的查詢。

如果真的不工作,你可以嘗試你的代碼添加到返回表預先定義的字段名稱的SQL Server過程。

+0

正如我所說,當我聲明參數和爲他們提供的值,查詢工作正常。當我將報告中的參數傳遞給數據集時,它看不到字段。但是,當我將計算字段添加到數據集時,我可以看到它正在返回正確數量的記錄,儘管我無法說服它向我顯示我想看到的字段。 – SarekOfVulcan

+0

我現在看到了。是的,它確實不會生成這些字段。你有沒有嘗試存儲過程的想法? – Diego

+0

還沒有。我可能不得不採取這種解決方案,但是這份報告違背了第三方應用程序,並且儘可能少地混淆了數據定義。 (學習這一課時,當我建立的Oracle物化視圖失控時,每次數據更新時都開始重建,而不是每天晚上兩點...) – SarekOfVulcan

0

我懷疑這是因爲你的代碼中有兩個查詢,即使只有一個要被執行。因此,我建議將這兩個查詢合併爲一個查詢。

+0

不幸的是,您不可能注意第一個查詢獲取參數,而OPEN_QUERY不允許參數。擴大整個事情是做到這一點的唯一方法。 – SarekOfVulcan

+0

@SarekOfVulcan:我明白了爲什麼您需要使用動態SQL,而不是直接將參數值綁定到查詢。但是,您應該能夠在單個SET語句中聲明整個查詢(包括OpenQuery中的聯接子查詢)。 (當然,這可能無法解決問題!) –

+0

啊,我明白你的觀點。我懷疑它沒有幫助,但我會稍後再嘗試。 – SarekOfVulcan

1

由於SSRS當您單擊刷新按鈕,執行與SET FMTONLY ON;存儲過程。然後將SET FMTONLY OFF;作爲存儲過程的第一行,它將返回您的字段。

+1

FMTONLY已被棄用。 – Mitch

1

你如何說服你有場一起工作SSRS?答案:手動將字段添加到數據集屬性...字段中的數據集。這將使設計者感到高興,並且只要在查詢執行時存在字段,報表就可以工作。至少它對我使用OLE DB查詢來處理動態查詢文本。

相關問題