将数据库导出为脚本;序列设置不正确

Export Database as Scripts; Sequences not set correctly

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

在 SSMS 中,我 select 任务 => 生成脚本...并获得一个包含所有 CREATE TABLE 语句等的 SQL 文件。

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

我能以某种方式设置序列根据其当前值获得起始值吗?

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

有关 sys.sequences 系统 table 的更多信息,请参见 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 生成的脚本末尾添加此语句。

例如,在我的测试数据库中,这是上一个脚本的结果:

A​​ndrea 的回答并不完全正确。 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