これは少し「鶏肉または卵」のようなクエリですが、クエリが実行されている現在のデータベースインスタンスの名前を返すクエリを誰かが思い描くことができるでしょうか。パラドックスを理解していると言ったら、私を信じてください。クエリを実行するために既に接続しているのに、データベースインスタンスの名前を知る必要があるのはなぜですか。マルチデータベース環境での監査。
Books Onlineのすべての@@グローバルを見てきました。 「SELECT @@servername
"が近づいていますが、サーバーではなくデータベースインスタンスの名前が必要です。
SELECT
@@servername AS 'Server Name' -- The database server's machine name
,@@servicename AS 'Instance Name' -- e.g.: MSSQLSERVER
,DB_NAME() AS 'Database Name'
,Host_NAME() AS 'Host Name' -- The database client's machine name
SELECT DB_NAME()
データベース名を返します。
DB_NAME()を使用できます:
SELECT DB_NAME()
あなたが正確に何を求めていたのか分かりません。監査の必要性のためにこのプロシージャを記述しているとき、ストアドプロシージャが別のデータベースに存在する場合、現在のデータベース名をどのように取得するのかを尋ねていると思います。例えば.
USE DATABASE1
GO
CREATE PROC spGetContext AS
SELECT DB_NAME()
GO
USE DATABASE2
GO
EXEC DATABASE1..spGetContext
/* RETURNS 'DATABASE1' not 'DATABASE2' */
これは正しい動作ですが、常にあなたが探しているものではありません。これを回避するには、MasterデータベースにSPを作成し、プロシージャをシステムプロシージャとしてマークする必要があります。これを行う方法は、SQL Serverのバージョン間で異なりますが、SQL Server 2005の方法です。 (2000年にmaster.dbo.sp_MS_upd_sysobj_category
関数)。
USE MASTER
/* You must begin function name with sp_ */
CREATE FUNCTION sp_GetContext
AS
SELECT DB_NAME()
GO
EXEC sys.sp_MS_marksystemobject sp_GetContext
USE DATABASE2
/* Note - no need to reference master when calling SP */
EXEC sp_GetContext
/* RETURNS 'DATABASE2' */
これがあなたが探していたものであることを願っています
SELECT DB_NAME() AS DatabaseName
単に使用:
select @@servicename
あなたは使用できるはずです:
SELECT SERVERPROPERTY ('InstanceName')