如何查询当前 SQL Server 数据库实例的名称?

39

这有点像“先有鸡还是先有蛋”的问题,但是有没有人能够想出一条查询语句,可以返回执行查询的当前数据库实例的名称呢?当我说我理解这个悖论时,请相信我:如果您已经连接以执行查询,为什么需要知道数据库实例的名称?在多数据库环境中进行审计。

我已经查看了Books Online中的所有@@全局变量。"SELECT @@servername"接近了,但我想要的是数据库实例的名称,而不是服务器的名称。


https://msdn.microsoft.com/en-us/library/ms189753.aspx - ROMANIA_engineer
8个回答

49
SELECT DB_NAME()
返回数据库名称。

1
返回给我的是主服务器而不是服务器\实例。 - Steam
更相关的:SELECT HOST_NAME() - Jeppe Stig Nielsen

43
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

2
另外添加:,HOST_NAME() AS '主机名' - Jeppe Stig Nielsen

5
您可以使用 DB_NAME()
SELECT DB_NAME()

5

我不确定您确切地在问什么。由于您正在为审计需求编写此过程,我猜想您正在询问当存储过程存在于另一个数据库中时,如何获取当前数据库名称。例如:

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

这是正确的行为,但并不总是您所期望的。要解决这个问题,您需要在主数据库中创建SP,并将该过程标记为系统过程。虽然SQL Server版本之间的操作方法有所不同,但以下是SQL Server 2005的方法(使用master.dbo.sp_MS_upd_sysobj_category函数也可以在2000年版本中实现)。

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' */

希望这是您要找的内容。

4
SELECT DB_NAME() AS DatabaseName

3

只需简单使用:

select @@servicename

这个解决方案已经在问题中提到,但并没有给出期望的结果。 - Andy

1

你应该能够使用:

SELECT SERVERPROPERTY ('InstanceName') 

27
SELECT SERVERPROPERTY('InstanceName')返回NULL。 - Steam
1
还有其他属性,所以您也可以尝试 SELECT SERVERPROPERTY('ServerName'), SERVERPROPERTY('MachineName') 等等。请参阅 MSDN 文档 SERVERPROPERTY 以获取存在的某些属性列表。 - Jeppe Stig Nielsen
被管理员标记了...在2019年不再适用作为答案...正确的答案是SELECT DB_NAME(),它获得了46分(第46个是我的)。 - J. Chris Compton

0
您可以按照以下方式获取当前数据库实例名称

SELECT @@SERVICENAME                   -- SQLEXPRESS
SELECT SERVERPROPERTY ('InstanceName') -- SQLEXPRESS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接