Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách chọn tên cột từ nhiều bảng trong SQL Server 2000-2008 nằm trong một tập hợp tên

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng của chuỗi khởi tạo không phù hợp với đặc điểm kỹ thuật bắt đầu từ chỉ mục 0

  2. Sự cố về quyền khi chạy gói SSIS từ Sql Job

  3. chọn cùng một ngày mỗi tháng trong 5 năm tới bằng cách sử dụng SQL?

  4. Cách tạo Ràng buộc Kiểm tra trên Nhiều Cột trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 84

  5. 'COLLATE SQL_Latin1_General_CP1_CI_AS' làm gì?