2012-12-07 15 views
6

मैं रिपोर्टिंग और एक संग्रहीत प्रक्रिया को क्रियान्वित अपनी रिपोर्टोंकैसे संग्रहीत प्रक्रिया में एकल पैरामीटर के लिए एक से अधिक मान पारित करने के लिए

DECLARE @return_value int 

EXEC @return_value = [dbo].[MYREPORT] 
     @ComparePeriod = 'Daily', 
     @OverrideCompareDate = NULL, 
     @PortfolioId = '5,6', 
     @OverrideStartDate = NULL, 
     @NewPositionsOnly = NULL, 
     @SourceID = 13 

SELECT 'Return Value' = @return_value 

GO 

ऊपर में लिए डाटा उत्पन्न करना है जब मैं @PortfolioId = '5,6' पारित कर यह दे रहा है के लिए SSRS उपयोग कर रहा हूँ मुझे गलत इनपुट

मुझे portfolio id 5 and 6 also के लिए सभी रिकॉर्ड की आवश्यकता है एकाधिक मान भेजने के लिए यह सही तरीका है?

जब मैं अपने रिपोर्ट केवल @PortfolioId = '5' दे रही है यह मुझे 120 रिकॉर्ड दे रहा है और जब मैं यह @PortfolioId = '6' देकर निष्पादित यह मुझे 70 रिकॉर्ड

तो दे रहा है जब मैं @PortfolioId = '5,6' दे देंगे यह केवल मुझे देने के लिए करना चाहिए था पर अमल 1 9 0 रिकॉर्ड्स पूरी तरह से, लेकिन यह मुझे रिकॉर्ड का अधिक नहीं दे रहा है, मुझे समझ में नहीं आता कि मैं वास्तव में गलत कहां जाता हूं।

क्या कोई मेरी मदद कर सकता है? धन्यवाद

enter image description here

सभी कोड, भी चस्पा करने के लिए बहुत बड़ा है मैं कर रहा हूँ चिपकाने प्रासंगिक कोड कृपया सुराग सुझाव देते हैं।

CREATE PROCEDURE [dbo].[GENERATE_REPORT] 
(
    @ComparePeriod VARCHAR(10), 
    @OverrideCompareDate DATETIME, 
    @PortfolioId VARCHAR(50) = '2', --this must be multiple 
    @OverrideStartDate DATETIME = NULL, 
    @NewPositionsOnly BIT = 0, 
    @SourceID INT = NULL 

) AS 
BEGIN 
SELECT 
      Position.Date, 
      Position.SecurityId, 
      Position.Level1Industry, 
      Position.MoodyFacilityRating, 
      Position.SPFacilityRating, 
      Position.CompositeFacilityRating, 
      Position.SecurityType, 
      Position.FacilityType, 
      Position.Position 

     FROM 
      Fireball_Reporting.dbo.Reporting_DailyNAV_Pricing POSITION WITH (NOLOCK, READUNCOMMITTED) 
     LEFT JOIN Fireball.dbo.AdditionalSecurityPrice ClosingPrice WITH (NOLOCK, READUNCOMMITTED) ON 
        ClosingPrice.SecurityID = Position.PricingSecurityID AND 
        ClosingPrice.Date = Position.Date AND 
        ClosingPrice.SecurityPriceSourceID = @SourceID AND 
        ClosingPrice.PortfolioID IN (
       SELECT 
       PARAM 
       FROM 
       Fireball_Reporting.dbo.ParseMultiValuedParameter(@PortfolioId, ',')           ) 
+1

देख रहा था तुम हमें ** हस्ताक्षर संग्रहीत प्रक्रिया के ** दिखा सकते हैं (क्या नाम और अपने मापदंड हैं डेटाटाइप्स), और आप अपनी संग्रहीत प्रक्रिया में उस पैरामीटर '@ पोर्टफोलियो आईडी का उपयोग कैसे करते हैं? –

+0

हाय marc_s वास्तव में मैं रिपोर्ट पर एसएसआरएस रिपोर्टिंग का उपयोग कर रहा हूं, मेरे पास सभी पोर्टफोलियो नामों के साथ चेकबॉक्स के साथ ड्रॉपडाउन सूची है। जहां मैं एक ही समय में एकाधिक पोर्टफोलियो का चयन कर सकता हूं, इसलिए यदि मैं गलत नहीं हूं तो यह उपरोक्त प्रक्रिया को पारित करने जा रहा है। तो मुझे 5 और 6 पोर्टफोलियो – Neo

+0

के अलावा रिकॉर्ड की अधिक संख्या क्यों मिल रही है, मेरी प्रक्रिया कोड – Neo

उत्तर

8

यह आसानी से नहीं किया जा सकता है। NVARCHAR पैरामीटर को "एक से अधिक मान" लेने का कोई तरीका नहीं है। मैंने पहले क्या किया है - जैसा कि आप पहले से ही करते हैं - पैरामीटर मान को अल्पविराम से अलग मूल्यों वाली सूची की तरह बनाएं। फिर, संग्रहित प्रक्रिया में इस स्ट्रिंग को अपने हिस्सों में विभाजित करें।

स्ट्रिंग फ़ंक्शंस का उपयोग करके विभाजन को किया जा सकता है। एक अस्थायी तालिका में हर भाग जोड़ें। इस के लिए छद्म कोड हो सकता है:

CREATE TABLE #TempTable (ID INT) 
WHILE LEN(@PortfolioID) > 0 
BEGIN 
    IF NOT <@PortfolioID contains Comma> 
    BEGIN 
     INSERT INTO #TempTable VALUES CAST(@PortfolioID as INT) 
     SET @PortfolioID = '' 
    END ELSE 
    BEGIN 
     INSERT INTO #Temptable VALUES CAST(<Part until next comma> AS INT) 
     SET @PortfolioID = <Everything after the next comma> 
    END 
END 

फिर, आप SSRS में बहु मान पैरामीटर के लिए दस्तावेज़, जिसमें कहा गया है में रुचि हो सकती करने के लिए

WHERE PortfolioId IN (SELECT ID FROM #TempTable) 

संपादित
अपनी हालत बदलने के लिए:

आप किसी भी रिपोर्ट पैरामीटर के लिए एक बहुविकल्पीय पैरामीटर को परिभाषित कर सकते हैं जो आप बनाते हैं। हालांकि, अगर आप एक से अधिक पैरामीटर पास करना चाहते क्वेरी का उपयोग करके महत्व देता वापस कोई डेटा स्रोत के लिए, निम्न आवश्यकताओं को संतुष्ट होना चाहिए:

डेटा स्रोत SQL सर्वर, ओरेकल, विश्लेषण सेवाएँ, एसएपी बीआई NetWeaver होना चाहिए , या हाइपरियन एस्बेस।

डेटा स्रोत संग्रहीत प्रक्रिया नहीं हो सकता है। रिपोर्टिंग सेवाएं संग्रहीत प्रक्रिया में एक बहुविकल्पीय पैरामीटर सरणी को पारित करने का समर्थन नहीं करती है।

क्वेरी पैरामीटर निर्दिष्ट करने के लिए एक आईएन क्लॉज का उपयोग करना चाहिए।

This I found here

+0

हाय वास्तव में मैं रिपोर्ट पर एसएसआरएस रिपोर्टिंग का उपयोग कर रहा हूं, मेरे पास सभी पोर्टफोलियो नामों के साथ चेकबॉक्स के साथ ड्रॉपडाउन सूची है। जहां मैं एक ही समय में एकाधिक पोर्टफोलियो का चयन कर सकता हूं, इसलिए यदि मैं गलत नहीं हूं तो यह उपरोक्त प्रक्रिया को पारित करने जा रहा है। तो मुझे 5 और 6 पोर्टफोलियो – Neo

+0

के अलावा रिकॉर्ड के अधिक संख्या क्यों मिल रही हैं, क्या आप सुनिश्चित हैं कि पैरामीटर पास हो गया है जैसा कि आप मानते हैं? उत्तर देने के लिए संग्रहीत प्रक्रिया के लिए कोड देखना दिलचस्प होगा। –

+0

कृपया बहु मान पैरामीटर के बारे में मेरा संपादन नोट करें। –

1

या तो एक User Defined Table

का उपयोग या आप प्रति This Post के रूप में अपने स्वयं के सीएसवी समारोह को परिभाषित करते हुए सीएसवी उपयोग कर सकते हैं।

मैं शायद दूसरी विधि की अनुशंसा करता हूं, क्योंकि आपकी संग्रहीत प्रोआर पहले से ही सही प्रारूप में लिखी गई है और यदि आपको सड़क के नीचे ऐसा करने की आवश्यकता है तो आपको इसे बाद में आसान लगेगा।

चीयर्स!

+0

मेरी प्रक्रिया कोड जोड़ा गया – Neo

1

मुझे लगता है कि, नीचे दी गई प्रक्रिया आपको जो भी ढूंढ रही है उसकी सहायता करने में मदद करती है।

CREATE PROCEDURE [dbo].[FindEmployeeRecord] 
     @EmployeeID nvarchar(Max) 
    AS 
    BEGIN 
    DECLARE @sqLQuery VARCHAR(MAX) 
    Declare @AnswersTempTable Table 
    ( 
     EmpId int,   
     EmployeeName nvarchar (250),  
     EmployeeAddress nvarchar (250), 
     PostalCode nvarchar (50), 
     TelephoneNo nvarchar (50), 
     Email nvarchar (250), 
     status nvarchar (50), 
     Sex nvarchar (50) 
    ) 

    Set @sqlQuery = 
    'select e.EmpId,e.EmployeeName,e.Email,e.Sex,ed.EmployeeAddress,ed.PostalCode,ed.TelephoneNo,ed.status 
    from Employee e 
    join EmployeeDetail ed on e.Empid = ed.iEmpID 
    where Convert(nvarchar(Max),e.EmpId) in ('[email protected]+') 
    order by EmpId' 
    Insert into @AnswersTempTable 
    exec (@sqlQuery) 
    select * from @AnswersTempTable 
    END 
+0

संभावित समाधान का एक लिंक हमेशा स्वागत है, लेकिन कृपया [लिंक के चारों ओर संदर्भ जोड़ें] (http://meta.stackoverflow.com/a/8259/169503) तो आपका साथी उपयोगकर्ताओं को कुछ पता होगा कि यह क्या है और यह क्यों है। यदि लक्षित साइट पहुंच योग्य नहीं है या स्थायी रूप से ऑफलाइन हो जाती है, तो हमेशा एक महत्वपूर्ण लिंक के सबसे प्रासंगिक भाग को उद्धृत करें। ध्यान दें कि किसी बाहरी साइट_ के लिंक से अधिक स्पष्ट रूप से होना संभव है [क्यों और कैसे कुछ उत्तरों हटा दिए गए हैं?] (Http://stackoverflow.com/help/deleted-answers)। –

+2

यह भी ध्यान दें [उसी उत्तर] (http://stackoverflow.com/a/17590687/851811) लगभग एक साल पहले पोस्ट (और हटाया गया) था। यदि यह प्रश्न के लिए प्रासंगिक है, तो अपने ब्लॉग या साइट से लिंक करना ठीक है, लेकिन ध्यान रखें कि यह सुविधाजनक है कि किसी बाहरी साइट पर जाने के बिना उत्तर स्वयं ही खड़ा होता है। यदि कोई हो तो साइट पर आपके रिश्ते को स्पष्ट करना भी अच्छा लगेगा। –

+1

मैं 'सुविधाजनक' से आगे जाऊंगा और कहूंगा कि लिंक का पालन किए बिना प्रश्न का उत्तर देने के लिए पर्याप्त जानकारी रखने के उत्तर के लिए यह एक शर्त है। लिंक संदर्भ या विशेषता के लिए होना चाहिए जवाब ही नहीं। – indivisible

0

उपयोग इस

मैं लगभग 2 सप्ताह, बड़ी परेशानी होती है, लेकिन मैं अंत में इस साइट मिल गया है और यह कि क्या करना है की एक स्पष्ट माध्यम से गुजरने के लिए था इस सटीक मुद्दे पड़ा है।

http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/

मुझे आशा है कि यह लोगों को मदद मिलती है क्योंकि यह वास्तव में क्या मैं के लिए

संबंधित मुद्दे