Dành cho SQL Server 2005 trở lên
FWIW cho các phiên bản SQL Server mới hơn Tôi thích các chế độ xem danh mục hơn INFORMATION_SCHEMA
vì những lý do được nêu trong bài đăng blog này:
Trường hợp chống lại INFORMATION_SCHEMA
lượt xem
Cũng xem các cảnh báo như thế này về chủ đề TABLES (Transact-SQL) trên MSDN:
Vì vậy, truy vấn tôi sẽ sử dụng sẽ như sau (lọc ra các đối tượng hệ thống và cũng tránh các bảng #temp trong trường hợp bạn đang ở trong 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 '#%';
Để lặp lại điều này cho tất cả các cơ sở dữ liệu:
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
có các mệnh đề để tránh lỗi trong trường hợp bạn có cơ sở dữ liệu với các đối chiếu khác nhau.)
Đối với SQL Server 2000
Lưu ý rằng những điều trên không hữu ích cho SQL Server 2000, nhưng tôi không nghĩ rằng bạn nên đặt mục tiêu để có thể chạy cùng một truy vấn trên mọi phiên bản. SQL Server 2000 đã 13 tuổi và không còn hỗ trợ vài năm nữa; chắc chắn bạn có thể biện minh cho việc có mã đặc biệt cho nó. Trong trường hợp đó, tôi sẽ vẫn chọn truy vấn mà bạn có hơn INFORMATION_SCHEMA
, chỉ cần lọc ra các đối tượng hệ thống và bảng tạm thời (một lần nữa, chỉ có liên quan trong trường hợp bạn đang ở trong 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;
Bạn cũng có thể thực hiện việc này cho từng cơ sở dữ liệu trong SQL Server 2000, nhưng vì bạn không thể sử dụng NVARCHAR(MAX)
bạn sẽ phải sử dụng con trỏ, một loạt các biến hoặc sp_msforeachdb rất không được khuyến khích
.