sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan vælger du kolonnenavne fra flere tabeller i SQL Server 2000-2008, der er i et sæt navne

Til SQL Server 2005 og nyere

FWIW for nyere versioner af SQL Server Jeg foretrækker katalogvisningerne frem for INFORMATION_SCHEMA af de grunde, der er beskrevet i dette blogindlæg:

Sagen mod INFORMATION_SCHEMA visninger

Se også advarsler som denne om emnet TABELLER (Transact-SQL) på MSDN:

Så den forespørgsel, jeg ville bruge, ville være som følger (filtrering af systemobjekter og også undgå #temp-tabeller i tilfælde af, at du er i 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 '#%';

For at gentage dette for alle databaser:

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 klausuler er der for at forhindre fejl i det tilfælde, hvor du har databaser med forskellige sorteringer.)

Til SQL Server 2000

Bemærk, at ovenstående ikke hjælper for SQL Server 2000, men jeg synes ikke, du skal gøre det til et mål at kunne køre den samme forespørgsel på hver enkelt version. SQL Server 2000 er 13 år gammel og flere år uden support; helt sikkert kan du retfærdiggøre at have en speciel kode til det. I så fald ville jeg stadig vælge den forespørgsel, du har, frem for INFORMATION_SCHEMA , filtrer bare systemobjekter og midlertidige tabeller fra (igen, kun relevant hvis du er i 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;

Du kan også gøre dette for hver database i SQL Server 2000, men da du ikke kan bruge NVARCHAR(MAX) du skal enten bruge en markør, en masse variable eller meget ikke anbefalet sp_msforeachdb .



  1. Gruppér efter år i datofelt i MySQL

  2. SQL - Tjek om en kolonne automatisk stiger

  3. SQL-forespørgsel, der henter alle postnumre (adresse) inden for en radius på 20 mil fra et givet postnummer

  4. Hvordan ser Alter Table-syntaksen ud for at tilføje en DATETIME-kolonne?