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
.