【发布时间】:2010-09-12 21:24:59
【问题描述】:
这有点像“鸡或蛋”类型的查询,但有人能想出一个可以返回执行查询的当前数据库实例名称的查询吗?当我说我理解这个悖论时请相信我:如果您已经连接到执行查询,为什么还需要知道数据库实例的名称?在多数据库环境中进行审计。
我查看了联机丛书中的所有 @@ 全局变量。 “SELECT @@servername”很接近,但我想要数据库实例的名称而不是服务器的名称。
【问题讨论】:
标签: sql-server tsql
这有点像“鸡或蛋”类型的查询,但有人能想出一个可以返回执行查询的当前数据库实例名称的查询吗?当我说我理解这个悖论时请相信我:如果您已经连接到执行查询,为什么还需要知道数据库实例的名称?在多数据库环境中进行审计。
我查看了联机丛书中的所有 @@ 全局变量。 “SELECT @@servername”很接近,但我想要数据库实例的名称而不是服务器的名称。
【问题讨论】:
标签: sql-server tsql
SELECT DB_NAME()
返回数据库名称。
【讨论】:
SELECT HOST_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
【讨论】:
,HOST_NAME() AS 'Host Name'
我不确定你到底在问什么。当您为审核需要编写此过程时,我猜您是在问当存储过程存在于另一个数据库中时如何获取当前数据库名称。例如
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' */
希望这就是你要找的东西
【讨论】:
您可以使用 DB_NAME() :
SELECT DB_NAME()
【讨论】:
SELECT DB_NAME() AS DatabaseName
【讨论】:
只需使用:
select @@servicename
【讨论】:
你应该可以使用:
SELECT SERVERPROPERTY ('InstanceName')
【讨论】:
SELECT SERVERPROPERTY('ServerName'), SERVERPROPERTY('MachineName')等。请参阅MSDN documentation SERVERPROPERTY 以获取一些 存在的属性的列表。