2010-12-07 17 views
4

SQL Server 2005データベースのテーブルsynonymから列のメタデータを確認するにはどうすればよいですか?私は 'Project'と呼ばれるテーブルのための 'ProjectSyn'という同義語を持っていますが、同義語のカラムメタデータは見つかりません。テーブルのシノニムから列のメタデータを取得する方法

私の推測では、シノニムの「ベーステーブル」を決定し、そのテーブルの列メタデータをクエリします。これは正しいアプローチですか、そうでない場合はどうなりますか?

+0

同義語とは何ですか? – Aliostad

+0

@Aliostad - データベースオブジェクトの代替名。レガシーコードを壊さずにオブジェクトの名前を変更するのに便利です(少なくとも理論上 - 時には抽象化はこの質問のように機能しません)。構文: 'CREATE SYNONYM ProjectSyn FOR Project' –

+0

ありがとうございました。絶対使用しないでください。 – Aliostad

答えて

1

を照会、シノニムのベース・オブジェクト名を取得するには? (編集済み)

select c.* 
from 
    sys.columns c 
    inner join sys.synonyms s on c.object_id = object_id(s.base_object_name) 
where 
    s.name = 'ProjectSyn' 
+0

ありがとう@ジョナスが、あなたのコードは少し仕事が必要です。 OBJECT_NAME関数は、base_object_nameが完全修飾された非修飾名を与えます。 – ProfK

+2

もちろん、シノニムが同じサーバー上の別のデータベースのオブジェクト、またはリンクされたサーバー上のオブジェクトの場合は、何も返しません。また、同義語が '[ProjectSyn]'のように角括弧で作成されている場合、base_object_name列にも含まれている必要があることにも注意してください。 – ErikE

+0

@ErikE apcの答えは、大カッコと一致することなく、データベース間およびリンクされたサーバーでも機能します。 – Arkaine55

1

はい、私は基本オブジェクトを取得し、列を取得すると思いますが、あなたの唯一のオプションです。

はちょうどこのような何かビュー sys.synonyms

3

これは、異なるデータベースの同義語で動作する私のソリューションです:

SELECT TOP 0 * INTO #TEMP1 FROM YourTable 
SELECT 
    [column_name] = c.name, 
    [data_type] = t.name, 
    [character_maximum_length] = c.max_length 
FROM tempdb.sys.columns c 
inner join tempdb.sys.types t on t.system_type_id = c.system_type_id 
WHERE [object_id] = object_id('tempdb..#TEMP1'); 
DROP TABLE #TEMP1 
+0

カラムのメタデータはどうですか?この答えには含まれていません。 – Taersious

+0

tempdb.sys.columns cまたはtempdb.sys.typesには、必要なメタデータフィールドが含まれます。たとえば、t.nameがタイプ名を提供します。使用可能なフィールドを表示するには、SELECT *でスクリプトを試してください。 – apc

関連する問題