2010-09-07 11 views
11

मेरे पास समान संरचना वाला बहु डेटाबेस है जिसका नाम "क्लाइंट 1234" है जो "क्लाइंट" के बगल में संख्याओं में भिन्न है, मेरे पास प्रत्येक डेटाबेस के अंदर "लेनदेन" नामक तालिका है और मैं क्वेरी को चलाने के लिए चाहता हूं सभी डेटाबेस में "लेनदेन" तालिका में सभी कच्चे गिनें।एकाधिक डेटाबेस (SQL सर्वर) पर क्वेरी

भी जब मैं डेटाबेस का चयन करता हूं तो मुझे यह जांचने की आवश्यकता होती है कि इसमें क्लाइंट शब्द है और इसमें शब्द के बगल में संख्याएं हैं।

+0

आप के लिए गतिशील रूप से चाहते क्वेरी सभी डेटाबेस (प्रत्येक डेटाबेस निर्दिष्ट किए बिना)? – Fosco

+0

हाँ मुझे सभी डेटाबेस पर एक क्वेरी चलाने की जरूरत है। –

उत्तर

12

कोशिश तो की तरह sp_msforeachdb संग्रहीत प्रक्रिया का इस्तेमाल:

create table #temp ([rows] int, [client] varchar(100)) 
exec sp_msforeachdb ' 
if ''?'' like ''Client%'' and exists(select * from ?.sys.tables t where t.name = ''Transactions'') 
begin 
insert into #temp select count(*), ''?'' from ?..Transactions 
end 
' 
select * from #temp 
drop table #temp 
0

यदि आप जिस डेटाबेस को क्वेरी करना चाहते हैं उसका नाम और संख्या पहले से ज्ञात नहीं है तो आप केवल गतिशील क्वेरी का उपयोग कर ऐसा कर सकते हैं। आप की तरह

SELECT COUNT(*) FROM Client1.dbo.Transactions 
SELECT COUNT(*) FROM Client2.dbo.Transactions 
... 

बेशक आप प्रत्येक डेटाबेस के लिए जगह में अपने उपयुक्त अनुमतियों की आवश्यकता है के एक स्क्रिप्ट जनरेट करना होगा।

1

आप इन प्रश्नों बनाने के लिए गतिशील एसक्यूएल का उपयोग कर सकते हैं:

select 'select count(*) from ' + name + '.dbo.transactions' 
from master..sysdatabases 
where name like 'Client%' 
and isnumeric(substring(name,6,1)) 

यह एक परिणाम के प्रत्येक पंक्ति एक SQL क्वेरी किया जा रहा है के साथ सेट वापस होगा एक विशिष्ट डेटाबेस गिनने के लिए। इसे एक प्रोग्रामिंग भाषा द्वारा उपभोग किया जा सकता है, जो कर्सर के रूप में उपयोग किया जाता है, आदि .. यदि आप अधिक जानकारी प्रदान करते हैं तो मैं एक बेहतर उदाहरण प्रदान कर सकता हूं।

+0

क्या होगा यदि उनमें से कुछ डेटाबेस में इस लेनदेन तालिका नहीं है? –

+0

हाँ कृपया अधिक जानकारी प्रदान करें। –

1

Fosco की विधि का उपयोग करते हैं, यह कोष्ठक [] डेटाबेस नाम के आसपास में डालने के लिए एक अच्छा विचार है:

SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions' 
FROM master..sysdatabases 
WHERE name like 'Client%' and isnumeric(substring(name,6,1)) 
संबंधित मुद्दे