2008-09-24 11 views
25

Bu bir "tavuk veya yumurta" türünde bir sorgunun bir sorusu, ancak birisinin sorguyu çalıştırdığı geçerli veritabanı örneğinin adını döndürebilecek bir sorguyu hayal edebilir mi? Paradoksu anladığımı söylediğimde bana inanın: Sorguyu yürütmek için zaten bağlıysanız, neden veritabanı örneğinin adını bilmeniz gerekiyor? Çok veritabanlı bir ortamda denetleme.Geçerli SQL Server veritabanı örneğinin adını nasıl sorgularım?

Books Online'da tüm @ globals'lara baktım. "SELECT @@servername" geliyor, ancak sunucu yerine veritabanı örneğinin adını istiyorum.

+0

-1 yazar şimdiki örnek adı sorulduğunda ancak mevcut veritabanı hakkında cevabını kabul isim ?! –

+0

Artık değil, [Gennady Vanin Novosibirsk] (http://stackoverflow.com/users/200449/gennady-vanin-novosibirsk). – flipdoubt

+0

sonra +1. Teşekkürler. Kafa karıştırıcıydı, yani zaman kaybına yol açıyordu (örneğin, sorunun başlığını düzenledim ve sonra geri aldım) –

cevap

1

Kullanılacak gerekir:

SELECT SERVERPROPERTY ('InstanceName') 
+25

SELECT SERVERPROPERTY ('InstanceName') bana bir NULL verir – Steam

+5

Kabul edilen yanıtın en iyi yanıt olmadığı zaman iyi bir örnek – aMazing

+0

sadece "değil en iyi cevap" değil, sadece yanlış cevap! – denfromufa

40
SELECT DB_NAME() 

Veritabanı adını döndürür.

+0

Bu, SQL Developer'da benim için çalışmıyor. 'ORA-00923 değerini döndürür: FROM anahtar kelimesi beklenen yerde bulunamadı 00923. 00000 - "ÖNERİLEN anahtar kelime bulunamadı" * Nedeni: * İşlem: Satırda Hata: 1 Sütun: 16'. Herhangi bir fikir? SELECT DATABASE(); 'Ayrıca başarısız olur. – Xonatron

+7

@MatthewDoucette Soru ve yanıtları, SQL Server'ın Oracle'a özgü olmamasıdır, bu yüzden sizin için başarısızdır. (Örneğin, Oracle belirtilen bir tablo olmadan 'select'i desteklemez, ancak SQL Server yapar.) –

+0

bana sunucu değil, master verir. – Steam

5
SELECT DB_NAME() AS DatabaseName 
6

Sen)DB_NAME (kullanabilirsiniz:

SELECT DB_NAME() 
5

Ben tam olarak ne soran vardı emin değilim. Bir Denetim gerekliliği için bu yordamı yazarken, sanırım Depolanan Yordam başka bir veritabanında var olduğunda geçerli veritabanı adını nasıl elde edeceğinizi soruyorsunuz. Örneğin.

USE DATABASE1 
GO 
CREATE PROC spGetContext AS 
SELECT DB_NAME() 
GO 
USE DATABASE2 
GO 
EXEC DATABASE1..spGetContext 
/* RETURNS 'DATABASE1' not 'DATABASE2' */ 

Bu doğru davranış, ancak her zaman aradığınız şey değil. Bunu elde etmek için Ana veritabanında SP oluşturmalı ve prosedürü Sistem Prosedürü olarak işaretlemelisiniz. Bunu yapma yöntemi, SQL Server sürümleri arasında farklılık gösterir, ancak burada SQL Server 2005 için yöntem (master.dbo.sp_MS_upd_sysobj_category işleviyle 2000'de yapmak mümkündür). Bu

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' */ 

Hope

16
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 
+0

Bu benim için çalıştı ve en hızlı hangisinin peşinde olduğumu bulmama izin ver. – MGOwen

+1

Şuna ekleyin: ', HOST_NAME() AS 'Ana Bilgisayar Adı' –

2

aradığını olduğunu sadece kullanım:

select @@servicename 
İlgili konular