版本不可知SQL Server脚本/语句,用于检测特定数据库的存在

时间:2008-12-12 19:19:40

标签: sql-server tsql

由于该版本的打包特性,需要创建一个SQL Server脚本(更多的是一个语句),它可以在SQL Server 7.0到2008之间正确执行,这基本上可以达到这个目的:

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

这很难的原因:

SQL 7'sys.databases'无效

SQL 2008'sysdatabases'无效

我使用serverproperty愚蠢地解析了版本号,根据版本允许IF:

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

然后在SQL 7下发现serverinstperty不存在。

请注意,SQL可以远离安装,因此在本地计算机上没有任何困难 - reg条目/文件版本等是有用的。

SQL Server错误处理(尤其是7.0)很差,或者我可能不太了解它使它做一种try / catch。

我现在对此问题失明,所以任何指针都会受到赞赏。

谢谢,

加雷

6 个答案:

答案 0 :(得分:1)

尝试

USE数据库

并测试@@ ERROR。

  

USE数据库
  IF @@ ERROR<> 0 GOTO ErrExit

     

逻辑......

     

RETURN 0

     

ErrExit:
  返回1

(或RAISERROR,或......)

答案 1 :(得分:1)

感谢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 

答案 2 :(得分:0)

你可以在USE [DatabaseName]周围尝试TRY ... CATCH。

答案 3 :(得分:0)

感谢Le Dorfier。它仍然存在引发错误并且不由GOTO处理的问题:

Msg 1801,Level 16,State 3,Line 9 数据库'DWCH​​Server'已存在。选择其他数据库名称。

我甚至尝试过

DECLARE @err int 使用DWCHServer

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

我试图避免这种情况,因为它可能会产生影响,具体取决于SQL框的设置。它可能会引用某人或某事。我对此表示怀疑,因为它是16级(其他用户错误 - 很好)而且只有17+通常会启动某种工作流程。

考虑将系统要求改为2000+;)

答案 4 :(得分:0)

我无法访问SQL 7实例,但我建议您尝试:

sp_helpDB

我知道这适用于sql 2000和sql 2005以获取数据库列表。我怀疑它也适用于SQL 7。

答案 5 :(得分:0)

sysdatabases是Sybase时代的一个残余,并且仍然存在于SQL 2008中(尽管已弃用)。您可以使用如下查询检查数据库是否存在:

IF EXISTS(SELECT 1 FROM master..sysdatabases where name ='Blah')