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

fli*_*ubt 30 t-sql sql-server

它有点像"鸡或鸡蛋"类型的查询,但有人可以梦想一个可以返回查询执行的当前数据库实例的名称的查询吗?相信我,当我说我明白悖论:如果你已经连接执行查询,为什么你需要知道数据库实例的名称?在多数据库环境中进行审计.

我查看了联机丛书中的所有@@ globals." SELECT @@servername"接近,但我想要数据库实例的名称而不是服务器.

Dan*_*ana 46

SELECT DB_NAME()
Run Code Online (Sandbox Code Playgroud)

返回数据库名称.

  • @MatthewDoucette问题及其答案是特定于SQL Server而不是Oracle,这就是为什么它失败的原因.(例如,Oracle不支持没有指定表但是SQL Server的`select`.) (8认同)

小智 30

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
Run Code Online (Sandbox Code Playgroud)

  • 除此之外:`,HOST_NAME()AS'主机名' (2认同)

Gia*_*sti 6

您可以使用DB_NAME():

SELECT DB_NAME()
Run Code Online (Sandbox Code Playgroud)


小智 5

SELECT DB_NAME() AS DatabaseName
Run Code Online (Sandbox Code Playgroud)


Oll*_*lie 5

我不确定你究竟在问什么.当您为审核需求编写此过程时,我猜您在询问当另一个数据库中存储过程存在时如何获取当前数据库名称.例如

USE DATABASE1
GO
CREATE PROC spGetContext AS
SELECT DB_NAME()
GO
USE DATABASE2
GO
EXEC DATABASE1..spGetContext
/* RETURNS 'DATABASE1' not 'DATABASE2' */
Run Code Online (Sandbox Code Playgroud)

这是正确的行为,但并不总是你正在寻找的.为了解决这个问题,您需要在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' */
Run Code Online (Sandbox Code Playgroud)

希望这是你想要的