Ответы:
Выполнение:
SELECT name FROM master.sys.databases
Это предпочтительный подход сейчас, а не dbo.sysdatabases
, который уже давно устарел.
Выполните этот запрос:
SELECT name FROM master.dbo.sysdatabases
или если вы предпочитаете
EXEC sp_databases
exec sp_databases
не работал. Два других ( master.dbo.sysdatabases
и sys.databases
) все еще работают.
Чтобы исключить системные базы данных:
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6
Отредактировано: 14:36 2/2/2013
Обновлен с точным значением database_id. Оно должно быть больше 4, чтобы пропустить список системных баз данных с идентификатором базы данных от 1 до 4.
SELECT *
FROM sys.databases d
WHERE d.database_id > 4
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Работает на нашем SQL Server 2008
ID
5 и 6 будут, ReportServer
и ReportServerTempDB
если вы их SQL Server Reporting Services
установили.
Поскольку вы используете .NET, вы можете использовать объекты управления SQL Server
Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost")
For Each db As Database In server.Databases
Console.WriteLine(db.Name)
Next
var SDBLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
Не запутайтесь, используйте приведенный ниже простой запрос, чтобы получить все базы данных,
select * from sys.databases
Если вам нужны только пользовательские базы данных;
select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
Некоторые имена системных баз данных (ресурс, дистрибуция, reportservice, reportservicetempdb) просто вставляют его в запрос. Если у вас есть вышеупомянутые БД в вашей машине по умолчанию.
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
Это будет работать для обоих условий, независимо от того, включена ли отчетность
Я использую следующий код объектов управления SQL Server, чтобы получить список баз данных, которые не являются системными и не являются моментальными снимками.
using Microsoft.SqlServer.Management.Smo;
public static string[] GetDatabaseNames( string serverName )
{
var server = new Server( serverName );
return ( from Database database in server.Databases
where !database.IsSystemObject && !database.IsDatabaseSnapshot
select database.Name
).ToArray();
}
var DBsLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
или foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)
как в .NET 4.0 + SQL Server 2014 или .SqlServer.Smo \ 12.0.0.0
Если вы хотите опустить системные базы данных и таблицы ReportServer (если установлены):
select
DATABASE_NAME = db_name(s_mf.database_id)
from
sys.master_files s_mf
where
s_mf.state = 0 and -- ONLINE
has_dbaccess(db_name(s_mf.database_id)) = 1
and db_name(s_mf.database_id) NOT IN ('master', 'tempdb', 'model', 'msdb')
and db_name(s_mf.database_id) not like 'ReportServer%'
group by s_mf.database_id
order by 1
Это работает на Sql Server 2008/2012/2014. Большая часть запросов поступает из системной хранимой процедуры sp_databases . Я только удалил ненужный столбец и добавил, где условия.
Не уверен, что при этом будут пропущены базы данных сервера отчетов, поскольку я не использую их, но из того, что я видел, я могу опустить системные пользовательские базы данных с этим SQL:
SELECT db.[name] as dbname
FROM [master].[sys].[databases] db
LEFT OUTER JOIN [master].[sys].[sysusers] su on su.sid = db.owner_sid
WHERE su.sid is null
order by db.[name]
возможно я додо!
show databases;
работал на меня.
Вы можете найти все имена баз данных с этим: -
select name from sys.sysdatabases
Чтобы исключить системные базы данных:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
его столбца на sys.databases
столе егоowner_sid