2016-03-04 11 views
5

मैं एक मेज Users है में एम्बेडेड एसक्यूएल,गतिशील चयन क्वेरी

 
╔════╦═══════╦══════╗ 
║ Id ║ Name ║ Db ║ 
╠════╬═══════╬══════╣ 
║ 1 ║ Peter ║ DB1 ║ 
║ 2 ║ John ║ DB16 ║ 
║ 3 ║ Alex ║ DB23 ║ 
╚════╩═══════╩══════╝ 

और कई डेटाबेस में समान संरचना (एक ही टेबल, एक ही प्रक्रियाओं, ...) है, इसलिए हर डेटाबेस एक मेज Project नाम दिया , और इस Project तालिका की संरचना,

 
╔════╦═════════╦═════════════╗ 
║ Id ║ Request ║ Information ║ 
╠════╬═════════╬═════════════╣ 
║ 1 ║  126 ║ XB1   ║ 
║ 2 ║  126 ║ D6   ║ 
║ 3 ║  202 ║ BM-23  ║ 
╚════╩═════════╩═════════════╝ 

तो, है जब मैं एक डेटाबेस क्वेरी:

SELECT count(distinct([Request])) as nbrRequests 
    FROM [SRV02].[DB1].[dbo].[Project] 

मैं इस परिणाम मिलता है:

 
╔═════════════╗ 
║ NbrRequests ║ 
╠═════════════╣ 
║   2 ║ 
╚═════════════╝ 

अब, क्या मैं चाहता हूँ करने के लिए "लिंक"/तालिका Users से इस क्वेरी, जहां Users तालिका में कॉलम Db है करने के लिए "में शामिल होने के" ... परिणाम है मेरी डेटाबेस का नाम है, इसलिए मैं इस तरह एक परिणाम प्राप्त कर सकते हैं:

 
╔════╦═══════╦══════╦═════════════╗ 
║ Id ║ Name ║ Db ║ NbrRequests ║ 
╠════╬═══════╬══════╬═════════════╣ 
║ 1 ║ Peter ║ DB1 ║   2 ║ 
║ 2 ║ John ║ DB16 ║   3 ║ 
║ 3 ║ Alex ║ DB23 ║   6 ║ 
╚════╩═══════╩══════╩═════════════╝ 
मैं गतिशील एसक्यूएल के साथ कोशिश कर रहा हूँ

, लेकिन कोई किस्मत।

एनबी: प्रत्येक उपयोगकर्ता केवल एक डेटाबेस है, और एक डेटाबेस केवल एक उपयोगकर्ता से संबंध रखते हैं, यह एक-से-एक संबंध

+1

वहाँ के बीच कोई लिंक है अनुरोध तालिका और इसके अलावा उपयोगकर्ता तालिका एक spec पर है ific डेटाबेस? और यदि नहीं, तो प्रति डेटाबेस एक से अधिक उपयोगकर्ता हैं, और यदि हां परिणाम क्या होंगे? –

+0

कृपया तालिका संबंध निर्दिष्ट करें और आप 2,3,6 – TheGameiswar

+0

डीबी केवल एक ही लिंक है, और प्रत्येक उपयोगकर्ता के पास केवल एक डेटाबेस है, और डेटाबेस केवल एक उपयोगकर्ता से संबंधित है। –

उत्तर

1

से बचने के इन 2 जवाब https://stackoverflow.com/a/35795690/1460399 और https://stackoverflow.com/a/35795189/1460399 का मेल, मैं इस समाधान मिल गया:

DECLARE @Query NVARCHAR(MAX)= 'SELECT u.Id, u.Name, u.Db, dbCts.nbrRequests FROM [Users] u INNER JOIN ('; 

DECLARE @QueryLength INT= LEN(@Query); 

SELECT @Query = @Query 
       +CASE WHEN LEN(@Query) > @QueryLength THEN ' UNION ' ELSE '' END 
       +'SELECT '''+Db+''' as db, count(distinct(Request)) as nbrRequests FROM [SRV02].'+Db+'[Project]' 
FROM Users; 

SET @Query = @Query+') dbCts ON u.Db = dbCts.db'; 

EXECUTE (@Query); 
3

जिस तरह से आप कर सकते हैं यह एक संघ हर विशिष्ट डेटाबेस तालिका की गिनती के साथ है और यह डेटाबेस के लिए एक पहचान देने, इस तरह:

SELECT u.Id, u.Name, u.Db, dbCts.nbrRequests 
    FROM [Users] u INNER JOIN 
     (SELECT 'DB1' as db, count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB1].[dbo].[Project] 
     UNION 
     SELECT 'DB16', count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB16].[dbo].[Project] 
     UNION 
     SELECT 'DB23', count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB23].[dbo].[Project] 
    ) dbCts ON u.Db = dbCts.db 

Users तालिका मैंने नहीं किया करने के लिए सर्वर और स्कीमा जोड़ने के लिए मत भूलना अपने प्रश्न पर ऐसी कोई जानकारी न होने के कारण।

इसके अलावा, आपके कनेक्टेड उपयोगकर्ता को सभी डेटाबेस पर विशेषाधिकार होना चाहिए।

+2

मुझे नहीं लगता कि यह अनुरोध गतिशील है, हर बार जब मैं उपयोगकर्ता को जोड़ता हूं तो मुझे इसे बदलना होगा –

+0

@Hamza_L यह गतिशील नहीं है। और जब भी आप डेटाबेस जोड़ते हैं, तो आपको इसे बदलना होगा, यह देखते हुए कि यह एक आसान काम नहीं है, क्वेरी में दो पंक्तियां जोड़ना उतना ही नहीं होगा। लेकिन यह केवल एक दृष्टिकोण है। सबसे अच्छा जवाब चुनने के लिए स्वतंत्र महसूस करें :) –

1

डायनामिक एसक्यूएल बहुत मुश्किल हो सकता है।

यह उदाहरण उपयोगकर्ता तालिका से चयन क्वेरी बनाता है। प्रयोक्ता तालिका द्वारा लौटाई गई प्रत्येक पंक्ति के लिए परिवर्तनीय @Query बढ़ाया गया है। प्रत्येक पंक्ति एक क्वेरी देता है जो स्थानीय उपयोगकर्ता तालिका को रिमोट डीबी में प्रोजेक्ट टेबल में जोड़ती है। प्रत्येक क्वेरी के परिणाम UNIONED एक साथ हैं।

उदाहरण

यह उदाहरण QUOTENAME का उपयोग करता है मदद करने के लिए SQL injection attacks.

+0

आप क्यों हैं। आईडी = पी.आईडी? u.Id उपयोगकर्ता की आईडी है, और p.id प्रोजेक्ट की आईडी –

+0

है क्षमा करें, मैंने आपको स्कीमा को गलत समझा। मैं एक संपादन करूँगा .... –

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