3

テーブル「sys.all_objects」内のオブジェクトのスキーマ名を取得するにはどうすればよいですか?

OBJECT_SCHEMA_NAME 関数を使用すると、スキーマが dbo であることがわかっている場合に「sys」が返されます...

select OBJECT_SCHEMA_NAME(o.schema_id),* from sys.all_objects o

別のビューを使用したくありませんが、必要に応じて他のテーブルに参加できます。

4

4 に答える 4

3

Use "object_id" not "schema_id"

select OBJECT_SCHEMA_NAME(o.object_id),* from sys.all_objects o

于 2012-08-30T15:40:00.337 に答える
2

などのシステムオブジェクトについて話しているのsp_helptextですか? sp_helptext複数の形式を使用して およびその他のシステム オブジェクトを呼び出すことができます。これらは自動的に変換されます (主に下位互換性のため)。

EXEC sp_helptext 'sp_helptext';
EXEC dbo.sp_helptext 'sp_helptext';
EXEC sys.sp_helptext 'sp_helptext';

SELECT * FROM sysobjects;
SELECT * FROM dbo.sysobjects;
SELECT * FROM sys.sysobjects;    

ただし、オブジェクトは 1 つのスキーマにのみ属することができます。この場合sysも同様に応答しdboます。

として表示されているユーザー オブジェクトがある場合は、そのsys内容をお知らせください。ユーザー オブジェクトを追跡しようとしているだけの場合は、スキーマの下dbo.foo存在する何かに名前を付けた可能性があります。システムオブジェクトを返したくない場合は、代わりにsys提案するかもしれません。sys.objectssys.all_objects

編集:

レイが指摘したようschema_idに、関数に渡しています。ドキュメントobject_idには、 ではなくを渡す必要があることが示されていますschema_id。したがって、次のいずれかを実行します。

SELECT OBJECT_SCHEMA_NAME(o.[object_id]),* FROM sys.all_objects o;

-- or

SELECT SCHEMA_NAME(o.[schema_id]),* FROM sys.all_objects o;

個人的には、結合を好みます。

SELECT s.name, o.* FROM sys.all_objects AS o;
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id];

なんで?このクエリは複数のデータベースで機能しますが、メタデータ関数のいくつかは NULL を返すか、さらに悪いことに、別のデータベースから呼び出すと間違ったオブジェクトを返します。

于 2012-08-30T15:42:26.253 に答える
1

これを試して:

select OBJECT_NAME(o.object_id),* from sys.all_objects o

列を選択することもできますname

select o.name,* from sys.all_objects o
于 2012-08-30T15:36:45.130 に答える