За SQL Server 2005 и по-нова версия
FWIW за по-нови версии на SQL Server Предпочитам каталожните изгледи пред INFORMATION_SCHEMA
поради причините, посочени в тази публикация в блога:
Делото срещу INFORMATION_SCHEMA
показвания
Вижте също предупреждения като това по темата ТАБЛИЦИ (Transact-SQL) на MSDN:
Така че заявката, която бих използвал, ще бъде както следва (филтриране на системни обекти и избягване на #temp таблици в случай, че сте в 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 '#%';
За да повторите това за всички бази данни:
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
клаузите са там, за да предотвратят грешки в случай, че имате бази данни с различни съпоставки.)
За SQL Server 2000
Имайте предвид, че горното не помага за SQL Server 2000, но не мисля, че трябва да си поставите за цел да можете да изпълнявате една и съща заявка за всяка отделна версия. SQL Server 2000 е на 13 години и няколко години няма поддръжка; със сигурност можете да оправдаете наличието на специален код за него. В който случай пак бих избрал заявката, която имате пред INFORMATION_SCHEMA
, просто филтрирайте системни обекти и временни таблици (отново, уместно само в случай, че сте в 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;
Можете да направите това и за всяка база данни в SQL Server 2000, но тъй като не можете да използвате NVARCHAR(MAX)
ще трябва или да използвате курсор, куп променливи или силно не се препоръчва sp_msforeachdb
.