【问题标题】:Export Database as Scripts; Sequences not set correctly将数据库导出为脚本;序列设置不正确
【发布时间】:2018-11-24 08:32:17
【问题描述】:

我想从 SQLServer 2016 获取数据库,并将其设置在客户站点上的 2014 服务器上。

在 SSMS 中,我选择 Tasks => Generate scripts... 并获得一个包含所有 CREATE TABLE 语句等的 SQL 文件。

我的印象是序列没有正确生成。这些序列正在使用中,并且当前值大于 1。但是,每个CREATE SEQUENCE 语句都有一个START WITH 1 子句。

我能否以某种方式设置序列根据它们的 cuurenty 值获得一个起始值?

【问题讨论】:

  • 不,这不是一个选项。你得到序列的定义;它不会针对当前使用“调整”该定义。身份列也会发生同样的事情。

标签: sql-server tsql ssms sql-server-2014 sql-server-2016


【解决方案1】:

使用系统表(在本例中为sys.sequences),您可以生成一个脚本来更改所有序列的当前值。

更多关于sys.sequences系统表的信息可以在here找到。

首先在您的 SQL Server 2016 数据库上运行以下脚本:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql = @sql + ' ALTER SEQUENCE ' + [name] 
                   + ' RESTART WITH '+ cast ([current_value] AS NVARCHAR(max)) 
                   + CHAR(10) + CHAR(13)    
FROM sys.sequences

PRINT @sql

输出应该是包含所有序列的当前值的ALTER SEQUENCE 语句列表;您现在可以在从 SSMS 生成的脚本的末尾添加此语句。

例如,在我的测试数据库中,这是之前脚本的结果:

【讨论】:

  • 这很好用。我只是希望,SSMS 会自己做。
【解决方案2】:

Andrea 的回答并不完全正确。 sys.sequencescurrent_value 包含之前已经分发的值。该序列应从下一个 increment 值开始。需要一些额外的转换,因为这些值存储为 sql_variant

DECLARE @sql NVARCHAR(max)=''

SELECT @sql = @sql + N' ALTER SEQUENCE ' + s.name + N'.' +sq.name 
                   + N' RESTART WITH '+ cast (cast(sq.current_value as bigint) + cast(sq.increment as bigint) AS NVARCHAR(20))
                   + CHAR(10) + CHAR(13)    
FROM sys.sequences sq
join sys.schemas s on s.schema_id = sq.schema_id

PRINT @sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2017-04-28
    • 2011-08-26
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多