Как я могу запросить имя текущего экземпляра базы данных SQL Server? - PullRequest
30 голосов
/ 25 сентября 2008

Это запрос типа "курица или яйцо", но может ли кто-нибудь придумать запрос, который может вернуть имя текущего экземпляра базы данных, в котором выполняется запрос? Поверьте мне, когда я говорю, что понимаю парадокс: зачем вам нужно знать имя экземпляра базы данных, если вы уже подключены для выполнения запроса? Аудит в среде с несколькими базами данных.

Я просмотрел все глобальные @@ в Books Online. "SELECT @@servername" близко, но я хочу имя экземпляра базы данных, а не сервера.

Ответы [ 7 ]

46 голосов
/ 25 сентября 2008
SELECT DB_NAME()

Возвращает имя базы данных.

27 голосов
/ 22 мая 2015
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
6 голосов
/ 25 сентября 2008

Вы можете использовать DB_NAME () :

SELECT DB_NAME()
5 голосов
/ 25 сентября 2008

Я не уверен, что именно вы спрашивали. Когда вы пишете эту процедуру для аудита, я предполагаю, что вы спрашиваете, как получить текущее имя базы данных, когда хранимая процедура существует в другой базе данных. например,

USE DATABASE1
GO
CREATE PROC spGetContext AS
SELECT DB_NAME()
GO
USE DATABASE2
GO
EXEC DATABASE1..spGetContext
/* RETURNS 'DATABASE1' not 'DATABASE2' */

Это правильное поведение, но не всегда то, что вы ищете. Чтобы обойти это, вам нужно создать SP в базе данных Master и пометить процедуру как системную процедуру. Метод выполнения этого отличается в версиях 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' */

Надеюсь, это то, что вы искали

5 голосов
/ 25 сентября 2008
SELECT DB_NAME() AS DatabaseName
4 голосов
/ 22 июля 2015

просто используйте:

select @@servicename
1 голос
/ 25 сентября 2008

Вы должны быть в состоянии использовать:

SELECT SERVERPROPERTY ('InstanceName') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...