Agnostic SQL Server Script / Statement, который обнаруживает существование определенной базы данных

Из-за упакованного характера релиза необходимо создать сценарий SQL Server (а точнее, оператор), который может корректно выполняться на SQL Server 7.0 до 2008 года, что может по существу достичь этого:

if exists(select * from sys.databases where name = 'Blah')

Причины этого сложны:

SQL 7 'sys.databases' недопустим

SQL 2008 'sysdatabase' недействителен

Я тупо разобрал номер версии, используя serverproperty, чтобы разрешить IF в зависимости от версии:

if (select CONVERT(int,replace(CONVERT(char(3),serverproperty ('productversion')),'.',''))) >= 80

Тогда обнаруженное свойство сервера не существует в SQL 7.

Обратите внимание, что SQL может быть удален от установки, поэтому никакой суеты на локальном компьютере - записи reg / версии файлов и т. Д. Не имеет никакого смысла.

Обработка ошибок в SQL Server (особенно в 7.0) плохая, или, может быть, я недостаточно хорошо ее понимаю, чтобы заставить ее делать что-то вроде «попробовать / поймать».

Теперь у меня проблемы с слепотой, поэтому любые указания будут оценены.

Спасибо,

Gareth

12.12.2008 19:19:39
Почему бы просто не проверить, является ли db_id ('databasename') нулевым
user610552 9.02.2011 22:46:51
6 ОТВЕТОВ

Пытаться

База данных USE

и тест @@ ОШИБКА.

ИСПОЛЬЗОВАТЬ базу данных
IF @@ ERROR <> 0 GOTO ErrExit

логика ...

ВОЗВРАТ 0

ErrExit:
ВОЗВРАТ 1

(или RAISERROR, или ...)

1
12.12.2008 19:28:02

Вы можете попробовать ПОПРОБУЙТЕ ... ЗАДАТЬ ИСПОЛЬЗОВАТЬ [DatabaseName].

0
12.12.2008 19:22:51
Он прямо упоминает, что TRY ... CATCH недоступен в ранних версиях SQL Server.
dkretz 12.12.2008 19:28:46

Спасибо Ле Дорфье. Это все еще имеет проблему, что ошибка возникает и не обрабатывается GOTO:

Сообщение 1801, уровень 16, состояние 3, строка 9 База данных «DWCHServer» уже существует. Выберите другое имя базы данных.

Я даже пытался

ОБЪЯВИТЬ @err int USE DWCHServer

SELECT @err = @@ error IF @err <> 0 GOTO ErrExit

Я пытался избежать этого, так как это может иметь последствия, в зависимости от настройки SQL-бокса. Это может быть страница кого-то или что-то. Я сомневаюсь в этом, так как это уровень 16 (Разная пользовательская ошибка - приятно), и только 17+ обычно запускают какой-то рабочий процесс.

Подумал об изменении системных требований до 2000+;)

0
12.12.2008 20:00:28

У меня нет доступа к экземпляру SQL 7, но я призываю вас попробовать:

sp_helpDB

Я знаю, что это работает на SQL 2000 и SQL 2005, чтобы получить список баз данных. Я подозреваю, что это работает и на SQL 7.

0
12.12.2008 21:28:28

Спасибо G Мастрос

Похоже, что это может дать 100% решение. Он доступен под SQL 7.

Мне нужно доделать и протестировать, но на первый взгляд думаю, что полетит.

Вот черновик кода к сведению.

create table #dwch_temp
(
name sysname
,db_size nvarchar(13)
,owner sysname
,dbid smallint
,created nvarchar(11)
,status nvarchar(600)
,compatibility_level tinyint
)
go



insert into #dwch_temp
exec sp_helpdb

if exists(select name from #dwch_temp where name = 'DWCHServer')


-- run the code


drop table #dwch_temp 
1
18.06.2014 19:04:44

sysdatabase является остатком эпохи Sybase и все еще присутствует в SQL 2008 (хотя и устарел). Вы можете проверить существование базы данных с помощью запроса:

ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ master..sysdatabase, где name = 'Blah')

0
5.06.2009 00:45:58