【问题标题】:How can I determine if a Sequence exist in SQL Server 2012?如何确定 SQL Server 2012 中是否存在序列?
【发布时间】:2013-09-26 18:30:31
【问题描述】:

我需要创建一个 SQL 脚本来确定一个序列是否存在于 SQL Server 2012 数据库中。我熟悉确定存储过程是否存在但不序列的过程。谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    确定 SQL Server 2012 中是否存在序列的脚本与检查存储过程非常相似。考虑以下检查存储过程是否存在的代码:

    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[SProc_Name]') AND type IN (N'P', N'PC')
    

    类型的“P”和“PC”值指定 sys.object 的类型是 SQL 存储过程或程序集 (CLR) 存储过程。要检查一个序列,您只需将其更改为“SO”,这表明它是一个序列对象:

    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[Sequence_Name]') AND type = 'SO'
    

    例如,如果你想创建一个不存在的序列,你可以使用下面的代码:

    IF NOT EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Sequence_Name]') AND type = 'SO')
    CREATE SEQUENCE [dbo].[Sequence_Name] 
        AS [bigint]
        START WITH 1
        INCREMENT BY 1
        MINVALUE 1
        MAXVALUE 9223372036854775807
        CACHE  3 
    GO
    

    我希望这会有所帮助!

    【讨论】:

    • 这就是我所需要的。谢谢。
    • 从 SQL Server 2005 开始,最好使用 更有针对性的目录视图,例如 sys.sequences,而不是查询“catch-all”sys.objects 并且必须记住您所讨论对象的必要type ....
    • @marc_s 是正确的,因为它更容易记住“更集中的目录视图”。出于习惯,我仍然使用sys.objects type,但我现在正在考虑进行转换。
    • @StevenFerrer 根据您提供的文章,“方法 4”表示“sys.sysobjects...将被弃用”而不是sys.objects:“微软建议使用目录视图@ 987654330@ 而不是sys.sysobjects 系统..."
    • @myidealab,好收获!我删除了我的评论,因为它并没有真正为这个答案增加价值。哈哈。非常感谢!
    【解决方案2】:

    通过检查sys.sequences表中的数据:

    select *
    from sys.sequences
    where object_id = object_id('schema_name.sequence_name')
    

    实际上,如果您确定除了名称等于'schema_name.sequence_name' 的序列之外没有其他对象,您可以检查object_id('schema_name.sequence_name') is not null

    sql fiddle demo

    【讨论】:

      【解决方案3】:

      这是 Tim S 的另一个快捷版本:

      IF OBJECT_ID('schema_name.sequence_name', 'SO') IS NOT NULL 
      BEGIN
          DROP SEQUENCE schema_name.sequence_name
      END
      

      【讨论】:

        【解决方案4】:

        试试这个。这将列出给定数据库的所有序列。

        SELECT
        seq.name AS [Sequence Name],
        seq.object_id AS [Object ID],
        seq.create_date AS [Creation Date],
        seq.modify_date AS [Last Modified Date],
        SCHEMA_NAME(seq.schema_id) AS [Schema],
        CAST(seq.precision AS int) AS [Numeric Precision],
        CAST(seq.scale AS int) AS [Numeric Scale],
        ISNULL(seq.start_value,N'''') AS [Start Value],
        ISNULL(seq.increment,N'''') AS [Increment Value],
        ISNULL(seq.minimum_value,N'''') AS [Min Value],
        ISNULL(seq.maximum_value,N'''') AS [Max Value],
        CAST(seq.is_cycling AS bit) AS [Is Cycle Enabled],
        ISNULL(seq.cache_size,0) AS [Cache Size],
        ISNULL(seq.current_value,N'''') AS [Current Value]
        FROM sys.sequences AS seq
        

        【讨论】:

          【解决方案5】:

          我使用的是 SQL Server 17.4(MS SQL Sever 的最新版本),这个 SQL 脚本可以与我一起使用。 例如,此 SQL 脚本会在不存在时创建序列。

          IF NOT EXISTS
          (
          SELECT [name]
          FROM sys.sequences
          WHERE [name] = 'seq_businessTripRequest'
          )
          BEGIN
          
          CREATE SEQUENCE [dbo].[seq_businessTripRequest]
          AS [BIGINT]
          START WITH 1
          INCREMENT BY 1
          MINVALUE-9223372036854775808
          MAXVALUE 9223372036854775807
          CACHE;
          
          END;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-30
            • 1970-01-01
            • 2010-11-15
            • 2010-09-18
            • 2010-09-13
            相关资源
            最近更新 更多