私は _OBJECT_DEFINITION
_と呼ばれる)というストアドプロシージャを使用しています 。これは、SQL Serverシステムに頭を抱えるのに役立ちます。ただし、まだ理解できない領域が1つあります。この1つのテーブル_sys.objects
_では、それ自体からプルされていることがわかります。
_1> SELECT OBJECT_DEFINITION(OBJECT_ID('sys.objects'))
2> GO
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE VIEW sys.objects AS
SELECT name,
.. stuff.
FROM sys.objects$
_
_sys.objects
_から_sys.objects$
_を選択する方法_sys.objects$
_とは何ですか?そこで考えて同じ名前のテーブルである可能性があります最初に同じ名前でテーブルとビューを作成しようとしましたが、できませんそれ。取得します(f
は選択した名前です)。これまでに使用したことのあるデータベースでは、これを行うことはできません。
_Msg 2714, Level 16, State 3, Server x230, Procedure f, Line 1
There is already an object named 'f' in the database.
_
Microsoft docs _sys.objects
_カタログビューとしてのみ 、それは ベーステーブル としてリストされていません
対応するカタログビュー _sys.system_objects
_はベーステーブルからプルします_sys.sysschobjs
_ 、および_OBJECT_DEFINITION
_はそれを明確に示しています。
私の推測では、ここのSQLは実際にビューが実行しているSQLではなく、ある種のコメントまたは説明:ソートのメタデータであり、バグが含まれています。しかし、私は完全にオフになる可能性があります。
sys.objects
はテーブルではなく、システムカタログビューです。質問に示されている定義は、Create VIEW ...
も示しています。また、sys.objects
はsys.objects$
と同じではありません。
sys.objects$
から選択できません。 DAC接続からSELECT
へのアクセスは、必ずしもシングルユーザーモードである必要はありませんが、DAC接続上にある必要があります。列の数が同じではありません。 DAC接続に接続し、以下を実行するだけです。
SELECT TOP (1) * FROM sys.objects;
GO
SELECT TOP (1) * FROM sys.objects$;
GO
sys.objects$
の基礎となるフィールド(末尾にsys.objects
がない)は、sysschobjs
、syssingleobjrefs
、syspalnames
のテーブルから取得されるため、$
は内部カタログビューである必要があります。