Mengapa sys.columns dan INFORMATION_SCHEMA.COLUMNS menampilkan jumlah kolom yang berbeda

11

Saya mencoba dua metode untuk menampilkan kolom dengan nama tertentu:

  1. INFORMATION_SCHEMA.COLUMNS

    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='SUPPLIER_NAME';
  2. SYS.COLUMNS

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

Mengapa kueri menampilkan output yang berbeda?

Ambil layar SSMS

Vinoth _S
sumber
Saya hanya punya 4 Kolom di Database saya. Tapi Menggunakan sys.columns itu menampilkan 5 Catatan saya tidak tidak Mengapa?
Vinoth _S
3
INFORMATION_SCHEMA.COLUMNShanyalah pandangan atas sys.columnsitu INNER JOINke sys.objectsdan membatasi ke objek jenis Tabel atau Tampilan. Dugaan saya adalah salah satu catatan Anda sys.columnsdihilangkan dalam batasan ini.
Mark Sinkinson
1
Keduanya sedikit berbeda. Silakan baca mssqltips.com/sqlservertutorial/183/informationschemacolumns dan msdn.microsoft.com/en-us/library/ms176106.aspx Saya akan mengatakan Anda harus membaca dokumentasi sebelum memposting
Shanky

Jawaban:

14

Perbedaan antara INFORMATION_SCHEMA.COLUMNSdan sys.columnsadalah jenis objek yang mereka liput. INFORMATION_SCHEMA.COLUMNSterbatas pada tabel dan tampilan. Anda dapat melihat kode di belakangnya dengan melakukan ini:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Jika Anda melihat bagian bawah di mana klausa Anda akan melihat

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

Di sinilah terbatas pada tabel dan tampilan saja.

Jika Anda kemudian melihat definisi sys.columns Anda akan melihat bahwa itu termasuk kolom untuk sejumlah objek lain:

  • Fungsi perakitan bernilai tabel (FT)
  • Fungsi SQL bernilai tabel sebaris (IF)
  • Tabel internal (TI)
  • Tabel sistem (S)
  • Fungsi SQL bernilai tabel (TF)

Jalankan ini dan Anda akan dapat melihat apa objek tambahan itu dan apa jenisnya.

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Kenneth Fisher
sumber