如何查询数据库模式是否存在

作为构build过程的一部分,我们运行数据库更新脚本,因为我们将代码部署到4个不同的环境。 此外,由于相同的查询将被添加,直到我们将发布放入生产,它必须能够在给定的数据库上运行多次。 喜欢这个:

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]')) BEGIN CREATE TABLE [Table] (...) END 

目前我在部署/构build脚本中有一个create schema语句。 我在哪里查询模式的存在?

你在找sys.schemas吗?

 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim') BEGIN EXEC('CREATE SCHEMA jim') END 

请注意, CREATE SCHEMA必须在自己的批处理中运行(根据下面的答案 )

@bdukes对于确定模式是否存在是正确的,但是上面的语句在SQL Server 2005中不起作用。CREATE CREATE SCHEMA <name>需要在它自己的批处理中运行。 解决方法是在exec中执行CREATE SCHEMA语句。

这是我在我的构build脚本中使用的:

 IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>') BEGIN -- The schema must be run in its own batch! EXEC( 'CREATE SCHEMA <name>' ); END 

只是为了增加 “防御性”,下面的版本会产生一个types转换错误,以说明大于1的匹配Schema的类似于validation代码经常故意的可能性(不太可能)。抛出exception,因为我相信这是好的,我相信尽pipe不太可能产生所有可能的返回结果,但是它是“最佳实践”,即使它只是产生一个致命的exception,因为停止处理的已知效果通常优于未捕获错误的未知级联效应。 因为这是不太可能的,我不认为这是值得一个单独的Count检查+ ThrowTryCatchThrow的麻烦生成一个更友好的致命错误,但仍然致命的错误。

SS 2005-:

 declare @HasSchemaX bit set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end 

SS 2008+:

 declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end 

然后:

 if @HasSchemaX = 1 begin ... end -- if @HasSchemaX = 1