馬鹿げたことを尋ねるリスクはありますが、Google-fuでは簡単に取得できませんが、類義語の基本オブジェクトからデータベースID(およびその他の情報)を照会する方法はありますか?
問題のシノニムはリモートのシノニムです(同じサーバー上の別のDBのテーブルを指します)。基本オブジェクト自体は固定されていません。プロシージャの実行ごとに異なるDB上の同じテーブルです。
非特定の方法(例:sys.synonymsのbase_object_name
列の解析に依存したくない)が欲しいのですが、それが唯一の選択肢であると言われたら、理解できます。
そしてそれは質問をしますので:並行性は問題ではないので、1つのクライアントだけがそのプロシージャを呼び出します。
これは、3つの部分からなるすべての名前、およびサーバーがローカルインスタンスであるすべての4つの部分からなる名前に対して機能します。
_SELECT
name, base_object_name,
DB_ID(PARSENAME(base_object_name,3)),
DB_NAME(DB_ID(PARSENAME(base_object_name,3)))
FROM sys.synonyms;
_
NULL
が表示された場合は、シノニムが2部構成になっている(たとえば、現在のデータベース内のオブジェクトを参照している)か、シノニムにリストされているデータベースが存在しない(名前が変更されたか、削除された可能性があります)等)。
4部構成の名前がリモートサーバーを参照している場合、DB_ID()/DB_NAME()
を使用できません。リモートサーバーの_master.sys.databases
_に参加する必要があります。これには、最初にリンクサーバーが使用され、動的SQLが構築されます。それについて言及するだけです。それはあなたのユースケースの問題ではないようです。
3部構成の名前のみに制限する場合は、以下の述部を追加できます。
_WHERE PARSENAME(base_object_name,3) IS NOT NULL
AND PARSENAME(base_object_name,4) IS NULL;
_