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





SELECT DB_NAME()
Возвращает имя базы данных.
дает мне мастер, а не сервер \ экземпляр.
Более актуально: SELECT HOST_NAME()
SELECT DB_NAME() AS DatabaseName
Вы должны уметь использовать:
SELECT SERVERPROPERTY ('InstanceName')
SELECT SERVERPROPERTY ('InstanceName') дает мне NULL
Есть и другие свойства, так что вы также можете попробовать SELECT SERVERPROPERTY('ServerName'), SERVERPROPERTY('MachineName') и так далее. См. Документация MSDN SERVERPROPERTY для списка немного существующих свойств.
Помечено для модераторов ... не работает как ответ в 2019 году ... Правильный ответ - SELECT DB_NAME (), у которого 46 баллов (46-е - мое).
Вы можете использовать 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' */
Это правильное поведение, но не всегда то, что вы ищете. Чтобы обойти это, вам необходимо создать 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' */
Надеюсь, это то, что вы искали
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
Добавьте к этому: ,HOST_NAME() AS 'Host Name'
просто используйте:
select @@servicename