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;и перечислите только базы данных, созданные пользователями.
Comments