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

时间:2008-10-22 14:42:00

标签: sql-server-2005 schema

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

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

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

5 个答案:

答案 0 :(得分:147)

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

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

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

答案 1 :(得分:144)

您在寻找sys.schemas吗?

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

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

答案 2 :(得分:1)

为了额外“防御性”,以下版本会生成类型转换错误,以说明&gt;的可能性(但不太可能) 1匹配Schema类似于验证代码通常故意抛出异常的原因,因为我认为它是好的,我相信它是“'最佳实践'”来考虑所有可能的返回结果,但不太可能,即使它只是生成致命的例外是因为停止处理的已知效果通常优于未捕获错误的未知级联效应。因为这不太可能,我认为单独的Count支票+ ThrowTry - Catch - Throw生成更加用户友好的致命错误,但仍然是致命的错误。

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

答案 3 :(得分:1)

如果组件的布局允许,那么它也起作用。

IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = 'myschema') SET NOEXEC ON 
go
CREATE SCHEMA myschema
GO 
SET NOEXEC OFF -- if any further processing is needed.
GO

答案 4 :(得分:0)

这太旧了,因此我不得不添加:对于SQL SERVER 2008+,这些都可以工作(对于选择部分),然后使用<template> <div class="about"> <h1>{{ localUser.displayName }}</h1> </div> </template> <script> export default { name: 'Home', props: ['localUser'], components: { }, data: function() { return { } }, methods: { }, mounted() { } } </script>来根据否定结果实际创建它。

EXECUTE('CREATE SCHEMA <name>')