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

Pul*_*ead 91 schema sql-server-2005

作为构建过程的一部分,我们在将代码部署到4个不同的环境时运行数据库更新脚本.此外,由于相同的查询将添加到,直到我们放下一个释放到生产它具有能够给定的数据库上运行多次.像这样:

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

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

vfi*_*lby 151

@bdukes确定模式是否存在是正确的,但上述语句在SQL Server 2005中不起作用.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
Run Code Online (Sandbox Code Playgroud)


bdu*_*kes 150

你在寻找sys.schemas吗?

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

请注意,CREATE SCHEMA必须以自己的批次运行(根据下面的答案)

  • 这在SQL 2008中不起作用,因为CREATE SCHEMA需要是批处理中的第一个语句,请参阅vfilby帖子以获取解决方法 (17认同)
  • 您可以使用"从sys.schemas中选择1"来提高性能. (3认同)
  • @vijaysylvester不,这是一个神话.SQL Server优化了列列表,因此放在那里并不重要.完全被忽略了.想要证明吗?把`SELECT 1/0 ......` (3认同)
  • 虽然 * vs 1 vs 1/0 可能不会产生任何性能差异,但在某些情况下它确实会产生差异。从安全角度来看,所有 3 个选择都要求您有权访问所有列,而命名特定列会导致仅检查查询中实际命名的列。因此,如果查询中任何表的任何列被拒绝,“select col-with-access...”会成功,而“select 1 ...”则不会成功。 (3认同)

Mar*_*iss 5

这是旧的,所以我觉得有必要添加: 对于 SQL SERVER 2008+ 这些都可以工作(对于选择部分),然后用于EXECUTE('CREATE SCHEMA <name>')在负面结果上实际创建它。

DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'

SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there

IF NOT EXISTS ( SELECT  top 1 *
                FROM    sys.schemas
                WHERE   name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'

SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned

SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned


IF EXISTS (
    SELECT sd.SchemaExists 
    FROM (
        SELECT 
            CASE 
                WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
                WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
                ELSE 0 
            END AS SchemaExists
    ) AS sd
    WHERE sd.SchemaExists = 1
)
BEGIN
    SELECT 'Got it';
END
ELSE
BEGIN
    SELECT 'Schema Missing';
END
Run Code Online (Sandbox Code Playgroud)

  • `IF schema_id ('MySchemaName') IS NULL` 效果很好,并且似乎比接受的答案更方便。 (2认同)