代码之家  ›  专栏  ›  技术社区  ›  Pulsehead

如果数据库架构存在,如何查询

  •  83
  • Pulsehead  · 技术社区  · 16 年前

    作为构建过程的一部分,我们在将代码部署到4个不同的环境时运行数据库更新脚本。此外,因为在我们将发布放到生产环境中之前,相同的查询将被添加到 能够在给定的数据库上运行多次。这样地:

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

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

    3 回复  |  直到 16 年前
        1
  •  134
  •   Community CDub    8 年前

    你在找吗 sys.schemas ?

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

    请注意 CREATE SCHEMA 必须在自己的批处理中运行(根据 the answer below )

        2
  •  143
  •   Aaron Bertrand    10 年前

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

    以下是我在构建脚本中使用的内容:

    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
    
        3
  •  1
  •   Tom    7 年前

    只是为了 额外的 “防御性”,以下版本生成类型转换错误,以说明>1匹配的可能性(但不太可能) Schema 类似于验证代码经常故意抛出异常,因为我认为这是好事,而且我认为考虑到所有可能的返回结果是“最佳实践”,尽管这不太可能,即使它只是生成一个致命的异常,因为停止处理的已知效果通常比未知的级联效果要好。未捕获的错误。因为这是极不可能的,我不认为这值得一个单独的麻烦 Count 检查+ Throw Try - Catch - 投掷 生成一个更用户友好的致命错误,但仍然是致命错误。

    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