Voor SQL Server 2005 en hoger
FWIW voor nieuwere versies van SQL Server Ik geef de voorkeur aan de catalogusweergaven boven INFORMATION_SCHEMA
om de redenen die in deze blogpost worden beschreven:
De zaak tegen INFORMATION_SCHEMA
weergaven
Zie ook waarschuwingen zoals deze over het onderwerp TABELLEN (Transact-SQL) op MSDN:
Dus de vraag die ik zou gebruiken zou als volgt zijn (systeemobjecten uitfilteren en ook #temp-tabellen vermijden in het geval dat je in tempdb bent):
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 '#%';
Om dit voor alle databases te herhalen:
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;
(De COLLATE
clausules zijn er om fouten te voorkomen in het geval u databases met verschillende sorteringen heeft.)
Voor SQL Server 2000
Merk op dat het bovenstaande niet helpt voor SQL Server 2000, maar ik denk niet dat je er een doel van moet maken om dezelfde query op elke afzonderlijke versie uit te voeren. SQL Server 2000 is 13 jaar oud en wordt al enkele jaren niet meer ondersteund; je kunt zeker rechtvaardigen dat je er een speciale code voor hebt. In dat geval zou ik nog steeds de zoekopdracht kiezen die je hebt over INFORMATION_SCHEMA
, filter er gewoon systeemobjecten en tijdelijke tabellen uit (opnieuw, alleen relevant als je in tempdb zit):
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;
U kunt dit ook voor elke database in SQL Server 2000 doen, maar aangezien u NVARCHAR(MAX)
niet kunt gebruiken je zult ofwel een cursor moeten gebruiken, een heleboel variabelen, of de sterk af te raden sp_msforeachdb
.