SQLServer2005以降の場合
SQLServerの新しいバージョンのFWIW私はINFORMATION_SCHEMA
よりもカタログビューを好みます このブログ投稿で概説されている理由のために:
トピック
したがって、私が使用するクエリは次のようになります(システムオブジェクトを除外し、tempdbにいる場合は#tempテーブルを回避します):
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
照合が異なるデータベースがある場合のエラーを防ぐために、句があります。)
SQLServer2000の場合
上記はSQLServer2000には役立ちませんが、すべてのバージョンで同じクエリを実行できるようにすることを目標にするべきではないと思います。 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
。