Agnostic SQL Server Script / Statement, который обнаруживает существование конкретной базы данных - PullRequest
2 голосов
/ 12 декабря 2008

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

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

Причины, по которым это сложно:

Недопустимый SQL 7 'sys.databases'

Недопустимая база данных SQL 2008 '1008 *

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

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

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

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

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

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

Спасибо

Gareth

Ответы [ 6 ]

1 голос
/ 13 декабря 2008

Спасибо G Mastros

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

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

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

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 голос
/ 12 декабря 2008

Попробуйте

USE база данных

и проверка @@ ОШИБКА.

USE база данных
IF @@ ERROR <> 0 GOTO ErrExit

логика ...

ВОЗВРАТ 0

ErrExit:
ВОЗВРАТ 1

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

0 голосов
/ 05 июня 2009

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

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

0 голосов
/ 12 декабря 2008

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

sp_helpDB

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

0 голосов
/ 12 декабря 2008

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

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

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

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

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

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

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

0 голосов
/ 12 декабря 2008

Вы можете попробовать TRY ... CATCH вокруг USE [DatabaseName].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...