sys.columnsとINFORMATION_SCHEMA.COLUMNSが異なる数の列を表示するのはなぜですか


11

特定の名前の列を表示するために2つの方法を試しています。

  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.columnsを使用すると正しく表示されません5レコード
Vinoth _S 2014

3
INFORMATION_SCHEMA.COLUMNSただ景色であるsys.columnsことINNER JOINへのsys.objects表またはビューのオブジェクトタイプへと制限しています。私の推測ではsys.columns、この制限により、レコードの1つが削除されます。
マークシンキンソン2014

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]

where句の一番下を見ると、

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.