SQLServer2005以降の場合
INFORMATION_SCHEMA
SQL Serverの新しいバージョンのFWIWこのブログ投稿で概説されている理由から、カタログビューよりもカタログビューの方が好きです。
INFORMATION_SCHEMA
見解に対する訴訟
MSDNのトピックTABLES(Transact-SQL)で、次のような警告も参照してください。
オブジェクトのスキーマを決定するためにINFORMATION_SCHEMAビューを使用しないでください。オブジェクトのスキーマを見つける唯一の信頼できる方法は、sys.objectsカタログビューを照会することです。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を使用する必要があります。