Tại sao sys.columns và Information_SCHema.COLUMNS hiển thị số lượng cột khác nhau


11

Tôi đang thử hai phương pháp để hiển thị các cột với một tên cụ thể:

  1. THÔNG TIN_SCHema.COLUMNS

    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='SUPPLIER_NAME';
  2. TRIỆU CHỨNG

    SELECT *
    FROM SYS.COLUMNS
    WHERE NAME='SUPPLIER_NAME'

Tại sao các truy vấn hiển thị đầu ra khác nhau?

Lấy màn hình SSMS


Tôi chỉ có 4 Cột trong Cơ sở dữ liệu của mình. Nhưng Sử dụng sys.columns nó hiển thị không tốt 5 Bản ghi tôi không có Tại sao?
Vinoth _S

3
INFORMATION_SCHEMA.COLUMNSchỉ là một cái nhìn qua sys.columnsINNER JOINs để sys.objectsvà hạn chế với các loại đối tượng của bảng hoặc View. Tôi đoán là một trong những hồ sơ của bạn sys.columnsbị loại bỏ trong hạn chế này.
Mark Sinkinson

1
Cả hai đều khác nhau một chút. Vui lòng đọc mssqltips.com/sqlservertutorial/183/informationschemacolumnsmsdn.microsoft.com/en-us/library/ms176106.aspx tôi sẽ nói bạn nên có tài liệu đọc trước khi gửi bài
Shanky

Câu trả lời:


14

Sự khác biệt giữa INFORMATION_SCHEMA.COLUMNSsys.columnslà các loại đối tượng họ bao gồm. INFORMATION_SCHEMA.COLUMNSđược giới hạn trong các bảng và khung nhìn. Bạn có thể xem mã đằng sau nó bằng cách làm điều này:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Nếu bạn nhìn vào phía dưới trong mệnh đề where bạn sẽ thấy

o.type IN ('U', 'V')

Đây là nơi chỉ giới hạn trong các bảng và dạng xem.

Nếu sau đó bạn nhìn vào định nghĩa của sys.columns bạn sẽ thấy rằng nó bao gồm các cột cho một số đối tượng khác:

  • Các hàm lắp ráp có giá trị bảng (FT)
  • Các hàm SQL có giá trị trong bảng (IF)
  • Bảng nội bộ (CNTT)
  • Bảng hệ thống (S)
  • Các hàm SQL có giá trị bảng (TF)

Chạy cái này và bạn sẽ có thể thấy đối tượng bổ sung là gì và nó là loại gì.

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.