Получить список баз данных из SQL Server
Как получить список доступных баз данных на экземпляре SQL Server? Я планирую сделать список из них в поле со списком в VB.NET.
15 ответов
выполнить:
SELECT name FROM master.sys.databases
это предпочтительный подход, а не dbo.sysdatabases
, который был устаревшим в течение некоторого времени.
выполнить этот запрос:
SELECT name FROM master.dbo.sysdatabases
или, если вы предпочитаете
EXEC sp_databases
в свете двусмысленности в отношении количества баз данных, не являющихся пользователями, вы, вероятно, должны добавить:
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
и добавьте имена баз данных служб reporting services
чтобы исключить системные базы данных:
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6
отредактировано: 2: 36 PM 2/5/2013
обновлено с точным database_id, он должен быть больше 4, чтобы пропустить список системные базы данных, которые имеют идентификатор базы данных между 1 и 4.
SELECT *
FROM sys.databases d
WHERE d.database_id > 4
поскольку вы используете .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
не запутайтесь, используйте приведенный ниже простой запрос, чтобы получить все базы данных,
select * from sys.databases
Если вам нужны только пользовательские базы данных;
select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
некоторые из имен системных баз данных (resource, distribution,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();
}
Если вы хотите опустить системные базы данных и таблицы 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 " системная хранимая процедура. Я только удаляю ненужный столбец и добавляю условия where.
Не уверен, что это опустит базы данных сервера отчетов, так как я не запускаю один, но из того, что я видел, я могу опустить системные пользовательские базы данных с этим 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]
в SQL Server 2008 R2 это работает:
select name
from master.sys.databases
where owner_sid > 1;
и список только баз данных, созданных пользователем (- АМИ).