使用Microsoft.SqlServer.Smo更改列标识

本文关键字:标识 Smo Microsoft SqlServer 使用 | 更新日期: 2023-09-27 18:28:28

我试图使用Microsoft.SqlServer.Smo从一个没有依赖项且之前加载了所有数据(从另一个数据库)的表中更改列IDENTITY,但我遇到了这样的错误:"不允许修改column对象的IDENTITY属性。您必须删除并重新创建具有所需属性的对象"。问题是,我试着用Management Studio来做这件事,它没有问题。你有什么建议吗?。提前感谢

这是代码:

foreach (Column source in sourcetable.Columns)
{
    try
    {
        if(source.Identity)
        {
            Column column = copiedtable.Columns[source.Name];
            // column.Computed = source.Computed;
            // column.ComputedText = source.ComputedText;
            column.Identity = source.Identity;
            column.IdentityIncrement = source.IdentityIncrement;
            column.IdentitySeed = source.IdentitySeed;
            column.Alter();
        }
    }
    catch { }
}

使用Microsoft.SqlServer.Smo更改列标识

再次尝试在SSMS中执行此操作,并选择编写操作脚本,而不是直接应用它。您会发现,它创建了一个标识属性设置为true的临时表(其他一切都相同),将数据从活动表复制到临时表中,删除活动表,并将临时表重命名为活动表。您需要对SMO执行类似的操作。

复制表很容易:迭代列、索引、外键等,并以这种方式创建新表(在调用Create()之前,请注意正确设置标识属性)。要移动数据,请查看Transfer类。一旦完成,它就是一个拖放和重命名(如果你想安全的话,也可以重命名和重命名)。

我有点惊讶的是,SMO并没有以某种方式在幕后做这件事(因为SSMS在幕后使用SMO)。如果我发现其他东西可以自动做到这一点,我会告诉你的。

您是在尝试更新现有记录还是添加新记录?如果要添加新记录,请执行插入操作。如果要更新现有记录,请不要覆盖标识列值。

若要在SQL Server中的表中插入标识值,必须告知数据库允许您这样做。语法为:

Set Identity_Insert [table] ON

当你完成后,你需要再次关闭它。

Set Identity_Insert [table] OFF