เหตุใด sys.columns และ INFORMATION_SCHEMA.COLUMNS จึงแสดงคอลัมน์จำนวนแตกต่างกัน


11

ฉันพยายามสองวิธีในการแสดงคอลัมน์ที่มีชื่อเฉพาะ:

  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'

เหตุใดแบบสอบถามจึงแสดงผลลัพธ์ต่างกัน

คว้าหน้าจอ SSMS


ฉันมีเพียง 4 คอลัมน์ในฐานข้อมูลของฉัน แต่การใช้ sys.column มันไม่แสดง 5 บันทึกฉันไม่ทำไม
Vinoth _S

3
INFORMATION_SCHEMA.COLUMNSเป็นเพียงมุมมองมากกว่าsys.columnsว่าINNER JOINเพื่อsys.objectsและ จำกัด ประเภทวัตถุของตารางหรือมุมมอง ฉันเดาว่าหนึ่งในบันทึกของคุณในsys.columnsถูกกำจัดในข้อ จำกัด นี้
Mark Sinkinson

1
พวกเขาทั้งสองต่างกันเล็กน้อย โปรดอ่านmssqltips.com/sqlservertutorial/183/informationschemacolumnsและmsdn.microsoft.com/en-us/library/ms176106.aspxฉันจะบอกว่าคุณควรอ่านเอกสารก่อนโพสต์
Shanky

คำตอบ:


14

ความแตกต่างระหว่างINFORMATION_SCHEMA.COLUMNSและsys.columnsเป็นประเภทวัตถุที่ครอบคลุม INFORMATION_SCHEMA.COLUMNSจำกัด เฉพาะตารางและมุมมอง คุณสามารถดูโค้ดข้างหลังได้โดยทำสิ่งนี้:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

หากคุณดูที่ด้านล่างในส่วนคำสั่งที่คุณจะเห็น

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

นี่คือที่ที่มันถูก จำกัด ไว้ที่ตารางและมุมมองเท่านั้น

ถ้าคุณไปดูคำจำกัดความของ sys.columns คุณจะเห็นว่ามันมีคอลัมน์สำหรับวัตถุอื่น ๆ จำนวนหนึ่ง:

  • ฟังก์ชันแอสเซมบลีของตาราง (FT)
  • ฟังก์ชัน SQL ที่มีค่าตารางแบบอินไลน์ (IF)
  • ตารางภายใน (IT)
  • ตารางระบบ (S)
  • ฟังก์ชัน SQL ที่มีค่าตาราง (TF)

เรียกใช้สิ่งนี้และคุณจะสามารถดูว่าวัตถุพิเศษคืออะไรและมันเป็นประเภทอะไร

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.