Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So wählen Sie Spaltennamen aus mehreren Tabellen in SQL Server 2000-2008 aus, die sich in einer Gruppe von Namen befinden

Für SQL Server 2005 und höher

FWIW für neuere Versionen von SQL Server bevorzuge ich die Katalogansichten gegenüber INFORMATION_SCHEMA aus den in diesem Blogpost beschriebenen Gründen:

Der Fall gegen INFORMATION_SCHEMA Ansichten

Siehe auch Warnungen wie diese zum Thema TABLES (Transact-SQL) auf MSDN:

Die Abfrage, die ich verwenden würde, würde also wie folgt lauten (Systemobjekte herausfiltern und auch #temp-Tabellen vermeiden, falls Sie sich in tempdb befinden):

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 '#%';

Um dies für alle Datenbanken zu wiederholen:

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;

(Die COLLATE Klauseln sind da, um Fehler zu vermeiden, falls Sie Datenbanken mit unterschiedlichen Sortierungen haben.)

Für SQL Server 2000

Beachten Sie, dass das obige für SQL Server 2000 nicht hilft, aber ich denke nicht, dass Sie es sich zum Ziel setzen sollten, dieselbe Abfrage auf jeder einzelnen Version ausführen zu können. SQL Server 2000 ist 13 Jahre alt und wird seit einigen Jahren nicht mehr unterstützt; Sicherlich können Sie es rechtfertigen, einen speziellen Code dafür zu haben. In diesem Fall würde ich immer noch die Abfrage wählen, die Sie über INFORMATION_SCHEMA haben , filtern Sie einfach Systemobjekte und temporäre Tabellen heraus (wiederum nur relevant, wenn Sie sich in tempdb befinden):

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;

Sie können dies auch für jede Datenbank in SQL Server 2000 tun, aber da Sie NVARCHAR(MAX) nicht verwenden können Sie müssen entweder einen Cursor, eine Reihe von Variablen oder den sehr nicht zu empfehlen sp_msforeachdb .