SQL सर्वर 2005 और इसके बाद के संस्करण के लिए
SQL सर्वर के नए संस्करणों के लिए FWIW मैं INFORMATION_SCHEMA
पर कैटलॉग दृश्य पसंद करता हूं इस ब्लॉग पोस्ट में उल्लिखित कारणों के लिए:
INFORMATION_SCHEMA
के खिलाफ मामला दृश्य
TABLES (Transact-SQL)विषय पर इस तरह की चेतावनियां भी देखें। ए> एमएसडीएन पर:
तो मैं जिस क्वेरी का उपयोग करूंगा वह इस प्रकार होगी (सिस्टम ऑब्जेक्ट्स को फ़िल्टर करना और उस स्थिति में #temp टेबल से बचना जो आप tempdb में हैं):
SELECT t.name, c.name
FROM sys.tables AS t
INNER JOIN sys.columns AS c
ON t.[object_id] = c.[object_id]
WHERE c.name IN (N'name', N'firstname', etc.)
AND t.is_ms_shipped = 0
AND t.name NOT LIKE '#%';
सभी डेटाबेस के लिए इसे दोहराने के लिए:
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
UNION ALL SELECT db = N''' + name + ''',
t.name COLLATE Latin1_General_CI_AI,
c.name COLLATE Latin1_General_CI_AI
FROM ' + QUOTENAME(name) + '.sys.tables AS t
INNER JOIN ' + QUOTENAME(name) + 'sys.columns AS c
ON t.[object_id] = c.[object_id]
WHERE c.name IN (N''name'', N''firstname'', etc.)
AND t.is_ms_shipped = 0
AND t.name NOT LIKE ''#%'''
FROM sys.databases
-- WHERE ... -- probably don't need system databases at least
SELECT @sql = STUFF(@sql, 1, 18, '')
-- you may have to adjust ^^ 18 based on copy/paste, cr/lf, tabs etc.
+ ' ORDER BY by db, s.name, o.name';
EXEC sp_executesql @sql;
(COLLATE
उस मामले में त्रुटियों को रोकने के लिए खंड हैं जहां आपके पास अलग-अलग कॉलेशन वाले डेटाबेस हैं।)
एसक्यूएल सर्वर 2000 के लिए
ध्यान दें कि उपरोक्त SQL सर्वर 2000 के लिए मदद नहीं करता है, लेकिन मुझे नहीं लगता कि आपको इसे प्रत्येक संस्करण पर एक ही क्वेरी चलाने में सक्षम होने का लक्ष्य बनाना चाहिए। SQL Server 2000 13 वर्ष पुराना है और कई वर्षों से समर्थन से बाहर है; निश्चित रूप से आप इसके लिए विशेष कोड रखने का औचित्य साबित कर सकते हैं। इस मामले में मैं अभी भी आपके पास INFORMATION_SCHEMA
. से अधिक क्वेरी को चुनूंगा , बस सिस्टम ऑब्जेक्ट्स और अस्थायी तालिकाओं को फ़िल्टर करें (फिर से, केवल उस स्थिति में प्रासंगिक जब आप tempdb में हों):
SELECT [object] = so.name, [column] = sc.name,
[type] = st.name, [precision] = st.xprec,
[scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN
(N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;
आप SQL Server 2000 में भी प्रत्येक डेटाबेस के लिए ऐसा कर सकते हैं, लेकिन चूंकि आप NVARCHAR(MAX)
का उपयोग नहीं कर सकते हैं आपको या तो कर्सर का उपयोग करना होगा, चरों का एक समूह, या अत्यधिक अनुशंसित नहीं sp_msforeachdb
।