Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL Server 2000-2008 में एकाधिक तालिकाओं से कॉलम नामों का चयन कैसे करें जो नामों के एक सेट में हैं

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर क्वेरी परिणाम से स्तंभ शीर्षलेख निकालें

  2. एसक्यूएल सर्वर 2008 में ईमेल सत्यापन?

  3. सम्मिलन आदेश में मर्ज करें

  4. चयनित पंक्ति से मूल्य के साथ OUTPUT insert.id को मिलाएं

  5. SQL डेटा रीडर डेटा को डेटाटेबल में लोड करने में समस्या