Il s'agit en quelque sorte d'une requête de type "poulet ou œuf", mais quelqu'un peut-il imaginer une requête qui peut renvoyer le nom de l'instance de base de données actuelle dans laquelle la requête s'exécute? Croyez-moi quand je dis que je comprends le paradoxe: pourquoi avez-vous besoin de connaître le nom de l'instance de base de données si vous êtes déjà connecté pour exécuter la requête? Audit dans un environnement multi-base de données.
J'ai regardé tous les @@ globals dans Books Online. "SELECT @@servername
"se rapproche, mais je veux le nom de l'instance de base de données plutôt que le serveur.
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
SELECT DB_NAME()
Renvoie le nom de la base de données.
Vous pouvez utiliser DB_NAME ():
SELECT DB_NAME()
Je ne sais pas exactement ce que vous demandiez. Lorsque vous écrivez cette procédure pour un besoin d'audit, je suppose que vous demandez comment obtenir le nom de la base de données actuelle lorsque la procédure stockée existe dans une autre base de données. par exemple.
USE DATABASE1
GO
CREATE PROC spGetContext AS
SELECT DB_NAME()
GO
USE DATABASE2
GO
EXEC DATABASE1..spGetContext
/* RETURNS 'DATABASE1' not 'DATABASE2' */
C'est le comportement correct, mais pas toujours ce que vous recherchez. Pour contourner cela, vous devez créer le SP dans la base de données Master et marquer la procédure comme une procédure système. La méthode pour ce faire diffère entre les versions de SQL Server, mais voici la méthode pour SQL Server 2005 (il est possible de le faire en 2000 avec le master.dbo.sp_MS_upd_sysobj_category
fonction).
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' */
J'espère que c'est ce que vous cherchiez
SELECT DB_NAME() AS DatabaseName
tilisez simplement:
select @@servicename
Vous devriez pouvoir utiliser:
SELECT SERVERPROPERTY ('InstanceName')