这有点像“先有鸡还是先有蛋”的问题,但是有没有人能够想出一条查询语句,可以返回执行查询的当前数据库实例的名称呢?当我说我理解这个悖论时,请相信我:如果您已经连接以执行查询,为什么需要知道数据库实例的名称?在多数据库环境中进行审计。
我已经查看了Books Online中的所有@@全局变量。"SELECT @@servername
"接近了,但我想要的是数据库实例的名称,而不是服务器的名称。
这有点像“先有鸡还是先有蛋”的问题,但是有没有人能够想出一条查询语句,可以返回执行查询的当前数据库实例的名称呢?当我说我理解这个悖论时,请相信我:如果您已经连接以执行查询,为什么需要知道数据库实例的名称?在多数据库环境中进行审计。
我已经查看了Books Online中的所有@@全局变量。"SELECT @@servername
"接近了,但我想要的是数据库实例的名称,而不是服务器的名称。
SELECT DB_NAME()
返回数据库名称。SELECT HOST_NAME()
- Jeppe Stig NielsenSELECT
@@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 '主机名'
- Jeppe Stig NielsenSELECT DB_NAME()
我不确定您确切地在问什么。由于您正在为审计需求编写此过程,我猜想您正在询问当存储过程存在于另一个数据库中时,如何获取当前数据库名称。例如:
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' */
SELECT DB_NAME() AS DatabaseName
只需简单使用:
select @@servicename
你应该能够使用:
SELECT SERVERPROPERTY ('InstanceName')
SELECT SERVERPROPERTY('ServerName'), SERVERPROPERTY('MachineName')
等等。请参阅 MSDN 文档 SERVERPROPERTY
以获取存在的某些属性列表。 - Jeppe Stig NielsenSELECT @@SERVICENAME -- SQLEXPRESS
SELECT SERVERPROPERTY ('InstanceName') -- SQLEXPRESS