2009-05-28 20 views
34

मेरे पास एक संग्रहीत प्रक्रिया है जो कोई पैरामीटर नहीं लेती है, और यह दो फ़ील्ड लौटाती है। संग्रहीत प्रक्रिया किरायेदारों पर लागू होने वाले सभी लेनदेन को बताती है, और यह किरायेदार की शेष राशि और आईडी लौटाती है।मैं संग्रहीत प्रक्रिया में कैसे शामिल हो सकता हूं?

मैं एक रिकॉर्ड के साथ रिकॉर्ड रिकॉर्ड का उपयोग करना चाहता हूं, और मुझे किरायेदार की आईडी पर इसके परिणामों में शामिल होने की आवश्यकता है।

यह मेरा वर्तमान क्वेरी है:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo, 
     u.UnitNumber, 
     p.PropertyName 
FROM tblTenant t 
    LEFT JOIN tblRentalUnit u 
    ON t.UnitID = u.ID 

    LEFT JOIN tblProperty p 
    ON u.PropertyID = p.ID 

ORDER BY p.PropertyName, t.CarPlateNumber 

संग्रहीत प्रक्रिया यह है:

SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance FROM tblTenant tenant 
    LEFT JOIN tblTransaction trans 
    ON tenant.ID = trans.TenantID 
    GROUP BY tenant.ID 

मैं भी इसे करने के लिए संग्रहीत प्रक्रिया से संतुलन जोड़ना चाहते हैं।

मैं यह कैसे कर सकता हूं?

+0

आपका प्रश्न और आपका नमूना कोड टाई नहीं है - आप लेनदेन और उपयोगकर्ताओं के बारे में बात करते हैं; नमूना किरायेदारों और किराये की संपत्तियों के बारे में है। –

+0

किरायेदारों = उपयोगकर्ता। मैं क्वेरी में संतुलन जोड़ना चाहता हूं क्योंकि यह एक रिपोर्ट के लिए है, और किरायेदार की संपत्ति के बारे में सारी जानकारी की भी आवश्यकता है। – Malfist

+0

इसके अलावा, आप अपनी किराये इकाई और संपत्ति सारणी के बीच बाएं बाहरी जॉइन का उपयोग क्यों करेंगे? आपको अपने डेटाबेस को इस तरह की अव्यवस्थित विघटन की स्थिति में नहीं होने देना चाहिए कि इसकी आवश्यकता हो सकती है (आपको किराये की इकाई और संपत्ति के बीच एक विदेशी कुंजी बाधा होनी चाहिए जो किराए पर इकाई में अमान्य कोड को रोकती है)। –

उत्तर

20

मैं वास्तव में की तरह पिछले जवाब (सपा का उपयोग नहीं करते हैं), लेकिन आप के लिए किसी कारण से सपा में ही बंधे रहे हैं, आप इसे इस्तेमाल कर सकते हैं एक अस्थायी तालिका पॉप्युलेट करने के लिए, और फिर आगे शामिल हो अस्थायी मेज। ध्यान दें कि आप अपने आप को कुछ अतिरिक्त ओवरहेड खर्च करने जा रहे हैं, लेकिन यह एकमात्र तरीका है जिसे मैं वास्तविक संग्रहित प्रो का उपयोग करने के बारे में सोच सकता हूं।

फिर से, आप एसपी से मूल क्वेरी में क्वेरी को इनलाइन करने से बेहतर हो सकते हैं।

+3

मैं इसे इनलाइन नहीं करना चाहूंगा, क्योंकि यदि मैं एसपी बदलता हूं, तो मैं हर जगह शिकार करना है मैंने इसे रेखांकित किया है और इसे भी बदल दिया है – Malfist

+1

@ माफिस्ट, अगर आप इसे फ़ंक्शन या इनलाइन के बजाय एसपी होने का आग्रह करते हैं, तो आपका एकमात्र विकल्प एलनजी सुझाव देता है, एक टेम्प टेबल को पॉप्युलेट करता है और उस पर शामिल होता है। –

+0

एक अस्थायी तालिका के बजाय तालिका चर का उपयोग करने का प्रयास करें। – David

16

संक्षिप्त उत्तर "आप नहीं कर सकते"। आपको क्या करने की आवश्यकता होगी या तो एक सबक्वायरी का उपयोग करें या आप अपनी मौजूदा संग्रहीत प्रक्रिया को तालिका फ़ंक्शन में परिवर्तित कर सकते हैं। इसे फ़ंक्शन के रूप में बनाना इस बात पर निर्भर करेगा कि आपको "पुन: प्रयोज्य" होने की आवश्यकता होगी।

+1

एक यूडीएफ (उपयोगकर्ता परिभाषित फ़ंक्शन) जो एक तालिका लौटाता है वह अविश्वसनीय रूप से उपयोगी होगा। – TheTXI

+1

आपने कहा कि 'उप क्वेरी' का उपयोग करें। वैसे यह एक समाधान नहीं है? कृपया कुछ कोड के साथ क्या मतलब है कृपया समझाएं?धन्यवाद – Fandango68

1

मुझे आशा है कि आपकी संग्रहीत प्रक्रिया कर्सर लूप नहीं कर रही है!

यदि नहीं, तो अपने संग्रहीत प्रक्रिया से क्वेरी लेने के लिए और क्वेरी में उसी क्वेरी एकीकृत तुम यहाँ पोस्ट कर रहे हैं:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo, 
     u.UnitNumber, 
     p.PropertyName 
     ,dt.TenantBalance 
FROM tblTenant t 
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID 
    LEFT JOIN tblProperty p ON u.PropertyID = p.ID 
    LEFT JOIN (SELECT ID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
        FROM tblTransaction 
        GROUP BY tenant.ID 
      ) dt ON t.ID=dt.ID 
ORDER BY p.PropertyName, t.CarPlateNumber 

आप अपने संग्रहीत प्रक्रिया में एक प्रश्न की तुलना में अधिक कुछ कर रहे हैं, तो एक अस्थायी बनाने तालिका और संग्रहीत प्रक्रिया को इस अस्थायी तालिका में निष्पादित करें और फिर अपनी क्वेरी में उसमें शामिल हों।

create procedure test_proc 
as 
    select 1 as x, 2 as y 
    union select 3,4 
    union select 5,6 
    union select 7,8 
    union select 9,10 
    return 0 
go 

create table #testing 
(
    value1 int 
    ,value2 int 
) 

INSERT INTO #testing 
exec test_proc 


select 
    * 
    FROM #testing 
+0

मैं पूछ रहा हूं कि एसपी को कैसे एकीकृत किया जाए, क्योंकि मुझे नहीं पता कि कैसे – Malfist

+0

मेरा मानना ​​है कि एसपी कर्सर लूप कर रहा है – Malfist

0

क्यों न केवल आपके एसक्यूएल में गणना कर रहा है?

SELECT 
    t.TenantName 
    , t.CarPlateNumber 
    , t.CarColor 
    , t.Sex 
    , t.SSNO 
    , t.Phone 
    , t.Memo 
    , u.UnitNumber 
    , p.PropertyName 
    , trans.TenantBalance 
FROM tblTenant t 
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID 
    LEFT JOIN tblProperty p ON u.PropertyID = p.ID 
    INNER JOIN (
     SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
     FROM tblTenant tenant 
      LEFT JOIN tblTransaction trans ON tenant.ID = trans.TenantID 
     GROUP BY tenant.ID 
    ) trans ON trans.ID = t.ID 
ORDER BY 
    p.PropertyName 
    , t.CarPlateNumber 
33

की एक अस्थायी तालिका में सपा परिणाम डालें, तो शामिल हो:

CREATE TABLE #Temp (
    TenantID int, 
    TenantBalance int 
) 

INSERT INTO #Temp 
EXEC TheStoredProc 

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo, 
    u.UnitNumber, p.PropertyName 
FROM tblTenant t 
INNER JOIN #Temp ON t.TenantID = #Temp.TenantID 
... 
8

आपका संगृहीत प्रक्रिया आसानी से बजाय एक दृश्य के रूप में इस्तेमाल किया जा सकता है। फिर आप इसे किसी और चीज पर शामिल कर सकते हैं।

एसक्यूएल:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, 
    t.Memo, u.UnitNumber, p.PropertyName, TenantBalance 
FROM tblTenant t 
LEFT JOIN tblRentalUnit u 
ON t.UnitID = u.ID 
LEFT JOIN tblProperty p 
ON u.PropertyID = p.ID 
LEFT JOIN vwTenantBalance v 
ON t.ID = v.tenantID 
ORDER BY p.PropertyName, t.CarPlateNumber 
+0

@ck: क्या आप दिखा सकते हैं कि यह कैसे किया जाएगा? –

+0

@ जॉन सॉंडर्स: कोड – cjk

+1

के साथ अपडेट किया गया मुझे लगता है कि आपको यह पता चलेगा कि यह एक temp तालिका का उपयोग करने से एक बेहतर जवाब है क्योंकि यह अभी भी कोड का केंद्रीकृत टुकड़ा है जिसे केवल एक ही स्थान पर अपडेट करने की आवश्यकता होगी, और उसके पास एक अस्थायी तालिका बनाने के ऊपर, फिर इसमें डालने, फिर से बाहर का चयन करना। – cjk

5

मैं इस समस्या को प्रक्रिया के बजाय समारोह लेखन और क्रॉस SQL ​​विवरण में लागू का उपयोग कर समाधान किया गया:

CREATE VIEW vwTenantBalance 
AS 

SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
FROM tblTenant tenant 
LEFT JOIN tblTransaction trans 
ON tenant.ID = trans.TenantID 
GROUP BY tenant.ID 

, जिसे आप की तरह किसी भी बयान कर सकते हैं। यह समाधान SQL 2005 और बाद के संस्करणों पर काम करता है।

Gediminas Bukauskas

2

यह पहले से ही उत्तर दिया गया है, सबसे अच्छा तरीका काम के आसपास एक एसक्यूएल समारोह या एक दृश्य में संग्रहित प्रक्रिया कन्वर्ट करने के लिए है।

जैसा कि ऊपर बताया गया है, संक्षिप्त उत्तर यह है कि आप एसक्यूएल में संग्रहीत प्रक्रिया में सीधे शामिल नहीं हो सकते हैं, जब तक कि आप संग्रहीत प्रक्रिया के आउटपुट का उपयोग अस्थायी तालिका में नहीं कर लेते और अस्थायी तालिका में शामिल नहीं होते ऊपर समझाया।

मैं आपकी संग्रहीत प्रक्रिया को SQL फ़ंक्शन में परिवर्तित करके इसका उत्तर दूंगा और आपको अपनी पसंद की क्वेरी के अंदर इसका उपयोग करने का तरीका बताऊंगा।

CREATE FUNCTION fnMyFunc() 
RETURNS TABLE AS 
RETURN 
(
    SELECT tenant.ID AS TenantID, 
     SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
    FROM tblTenant tenant 
    LEFT JOIN tblTransaction trans ON tenant.ID = trans.TenantID 
    GROUP BY tenant.ID 
) 

अब जब कि समारोह का उपयोग करने के लिए, अपने एसक्यूएल में ...

SELECT t.TenantName, 
     t.CarPlateNumber, 
     t.CarColor, 
     t.Sex, 
     t.SSNO, 
     t.Phone, 
     t.Memo, 
     u.UnitNumber, 
     p.PropertyName 
FROM tblTenant t 
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID 
    LEFT JOIN tblProperty p ON u.PropertyID = p.ID 
    LEFT JOIN dbo.fnMyFunc() AS a 
     ON a.TenantID = t.TenantID 
ORDER BY p.PropertyName, t.CarPlateNumber 

आप ऊपर एसक्यूएल के भीतर से अपने कार्य में मिली पैरामीटर पास करना चाहते हैं, तो मैं तुम्हें CROSS APPLY या CROSS OUTER APPLY का उपयोग करें।

उस here पर पढ़ें।

चीयर्स

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

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