Pro SQL Server 2005 a vyšší
FWIW pro novější verze SQL Server Preferuji zobrazení katalogu před INFORMATION_SCHEMA
z důvodů uvedených v tomto příspěvku na blogu:
Případ proti INFORMATION_SCHEMA
zobrazení
Podívejte se také na varování podobná tomuto k tématu TABLES (Transact-SQL) na MSDN:
Takže dotaz, který bych použil, by byl následující (filtrování systémových objektů a také vyhýbání se tabulkám #temp v případě, že jste v 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 '#%';
Postup opakování pro všechny databáze:
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
klauzule jsou zde proto, aby zabránily chybám v případě, že máte databáze s různým řazením.)
Pro SQL Server 2000
Všimněte si, že výše uvedené nepomáhá pro SQL Server 2000, ale nemyslím si, že byste si měli stanovit cíl, abyste mohli spustit stejný dotaz na každé jednotlivé verzi. SQL Server 2000 je 13 let starý a několik let bez podpory; jistě můžete ospravedlnit speciální kód pro to. V takovém případě bych stále zvolil dotaz, který máte nad INFORMATION_SCHEMA
, stačí odfiltrovat systémové objekty a dočasné tabulky (opět relevantní pouze v případě, že jste v databázi 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;
Můžete to udělat pro každou databázi v SQL Server 2000, ale protože nemůžete použít NVARCHAR(MAX)
buď budete muset použít kurzor, spoustu proměnných nebo velmi nedoporučované sp_msforeachdb
.