Untuk SQL Server 2005 dan yang lebih baru
FWIW untuk versi SQL Server yang lebih baru Saya lebih suka tampilan katalog daripada INFORMATION_SCHEMA
untuk alasan yang diuraikan dalam posting blog ini:
Kasus terhadap INFORMATION_SCHEMA
tampilan
Lihat juga peringatan seperti ini pada topik TABEL (Transact-SQL) di MSDN:
Jadi kueri yang akan saya gunakan adalah sebagai berikut (memfilter objek sistem dan juga menghindari tabel #temp jika Anda menggunakan 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 '#%';
Untuk mengulangi ini untuk semua database:
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
klausa ada untuk mencegah kesalahan dalam kasus di mana Anda memiliki database dengan susunan yang berbeda.)
Untuk SQL Server 2000
Perhatikan bahwa hal di atas tidak membantu untuk SQL Server 2000, tetapi saya tidak berpikir Anda harus menjadikannya tujuan untuk dapat menjalankan kueri yang sama pada setiap versi. SQL Server 2000 berusia 13 tahun dan beberapa tahun tidak didukung; tentunya Anda dapat membenarkan memiliki kode khusus untuk itu. Dalam hal ini saya masih akan memilih kueri yang Anda miliki daripada INFORMATION_SCHEMA
, cukup filter objek sistem dan tabel temp (sekali lagi, hanya relevan jika Anda menggunakan 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;
Anda dapat melakukan ini untuk setiap database di SQL Server 2000 juga, tetapi karena Anda tidak dapat menggunakan NVARCHAR(MAX)
Anda harus menggunakan kursor, sekelompok variabel, atau sp_msforeachdb sangat tidak direkomendasikan
.