它有点像"鸡或鸡蛋"类型的查询,但有人可以梦想一个可以返回查询执行的当前数据库实例的名称的查询吗?相信我,当我说我明白悖论:如果你已经连接执行查询,为什么你需要知道数据库实例的名称?在多数据库环境中进行审计.
我查看了联机丛书中的所有@@ globals." SELECT @@servername
"接近,但我想要数据库实例的名称而不是服务器.
SELECT DB_NAME()
返回数据库名称.
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
您可以使用DB_NAME():
SELECT DB_NAME()
SELECT DB_NAME() AS DatabaseName
我不确定你究竟在问什么.当您为审核需求编写此过程时,我猜您在询问当另一个数据库中存储过程存在时如何获取当前数据库名称.例如
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' */
希望这是你想要的