2012-05-02 17 views
7

में गतिशील SQL क्वेरी से फ़ील्ड को कैसे सूचीबद्ध करें मैं एसएसआरएस में निम्न क्वेरी चला रहा हूं। यदि मैं दो पैरामीटर के लिए घोषणा जोड़ता हूं, तो यह 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) 

हालांकि, जब मैं इसे एसएसआरएस में प्लग करता हूं, तो यह पंजीकृत नहीं होता है कि रिपोर्ट करने के लिए कोई फ़ील्ड उपलब्ध है। मैं एसएसआरएस को कैसे समझा सकता हूं कि मेरे पास खेतों के साथ काम करने के लिए है? धन्यवाद।

संपादित करें: मैंने अभी क्वेरी में पैरामीटर घोषित किए हैं, और यह फ़ील्ड नामों को पहचाना गया है।

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

बेशक, यह अनियंत्रित है क्योंकि मैं मानकों को दो बार घोषित कर रहा था, एक बार क्वेरी पैरामीटर के रूप में और एक बार क्वेरी के भीतर। लेकिन, जैसे ही मैंने ऊपर की रेखाओं पर टिप्पणी की, मैंने फिर से खेतों को खो दिया।

उत्तर

4

किसी से अधिक का सुझाव दिया मैं एक अस्थायी तालिका में चयन करते हैं, तो मैं

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

के साथ अंतिम कार्यकारी बयान बदल दिया है और अब यह ठीक काम कर रहा है।

1

शायद आपकी क्वेरी के साथ कुछ गलत है। एसएसआरएस डेटासेट आपके द्वारा रखी गई किसी भी चीज़ का बहुत अधिक मूल्यांकन कर सकते हैं। उदाहरण के लिए, मैं सिर्फ इन 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 सेट क्षेत्र NAME2 पहचान किया था।

मैं आपको अपनी क्वेरी की समीक्षा करने की सलाह देता हूं।

यदि यह वास्तव में काम नहीं करता है, तो आप अपने कोड को SQL सर्वर प्रक्रिया में जोड़ने का प्रयास कर सकते हैं जो पूर्व-परिभाषित फ़ील्ड नामों वाली तालिका लौटाता है।

+0

जैसा कि मैंने कहा, जब मैंने पैरामीटर घोषित किए और उनके लिए मूल्य प्रदान किए, तो सवाल ठीक काम किया। यह तब हुआ जब मैंने रिपोर्ट से डेटासेट में पैरामीटर पास किए कि वह फ़ील्ड नहीं देख पाएगा। लेकिन, जब मैंने डेटासेट में गणना की गई फ़ील्ड जोड़ दी, तो मैं देख सकता था कि यह रिकॉर्ड्स की सही संख्या लौटा रहा था, हालांकि मैं इसे उन फ़ील्ड दिखाने के लिए मना नहीं कर सकता था जिन्हें मैं देखना चाहता था। – SarekOfVulcan

+0

अब मैं देखता हूं। हां, यह वास्तव में खेतों को उत्पन्न नहीं करता है। क्या आपने संग्रहीत प्रक्रिया विचार का प्रयास किया था? – Diego

+0

अभी तक नहीं। मुझे समाधान के लिए इसके साथ जाना होगा, लेकिन यह रिपोर्ट किसी तृतीय-पक्ष एप्लिकेशन के खिलाफ जा रही है, और मैं डेटा परिभाषाओं के साथ गड़बड़ करने की कोशिश करता हूं जितना संभव हो सके। (उस पाठ को सीख लिया जब मैंने बनाया था ओरेकल भौतिक दृश्य जो नियंत्रण से बाहर हो गया था और हर बार डेटा अपडेट होने पर हर बार दोबारा 2:00 बजे के बजाय खुद को पुनर्निर्माण शुरू कर दिया ...) – SarekOfVulcan

0

मुझे संदेह है कि ऐसा इसलिए है क्योंकि आपके कोड में दो प्रश्न हैं, भले ही केवल एक ही निष्पादित किया जाए। इसलिए मैं एक प्रश्न में दो प्रश्नों को संयोजित करने का सुझाव देता हूं। MSDN मंचों पर

+0

संभव नहीं है, दुर्भाग्यवश - आप ध्यान दें कि पहली क्वेरी पैरामीटर प्राप्त कर रही है, और OPEN_QUERY पैरामीटर की अनुमति नहीं देता है।पूरी चीज का विस्तार करना इसे करने का एकमात्र तरीका है। – SarekOfVulcan

+0

@SarekOfVulcan: मैं देख सकता हूं कि आपको सीधे क्वेरी पर पैरामीटर मानों को बाध्य करने के बजाय गतिशील एसक्यूएल का उपयोग क्यों करना होगा। हालांकि, आप एक ही एसईटी कथन में पूरी क्वेरी (OpenQuery में शामिल उपकुंजी सहित) घोषित करने में सक्षम होना चाहिए। (बेशक, यह समस्या को हल नहीं कर सकता है!) –

+0

आह, मैं आपका बिंदु देखता हूं। मुझे संदेह है कि इससे मदद नहीं मिलेगी, लेकिन मैं इसे बाद में कोशिश करूंगा। – SarekOfVulcan

1

चूंकि एसएसआरएस रीफ्रेश बटन पर क्लिक करते समय संग्रहीत प्रक्रिया को SET FMTONLY ON; के साथ निष्पादित करता है। फिर अपनी संग्रहीत प्रक्रिया में पहली पंक्ति के रूप में SET FMTONLY OFF; रखें और यह आपके फ़ील्ड वापस कर देगा।

+1

FMTONLY को बहिष्कृत कर दिया गया है। – Mitch

1

आप एसएसआरएस को कैसे मानते हैं कि आपके पास काम करने के लिए फ़ील्ड हैं? उत्तर: डेटासेट गुणों से डेटासेट में मैन्युअल रूप से फ़ील्ड जोड़ें ... फ़ील्ड। इससे डिजाइनर को खुश कर दिया जाएगा और जब तक क्वेरी निष्पादित की जाती है तब तक फ़ील्ड मौजूद होती है, रिपोर्ट काम करेगी। कम से कम यह डायनेमिक क्वेरी टेक्स्ट के साथ डीबी 2 को ओएलई डीबी क्वेरी का उपयोग करके मेरे लिए काम करता है।