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

时间:2014-10-31 02:42:14

标签: c# sql-server

我尝试使用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 { }
}

2 个答案:

答案 0 :(得分:1)

再次尝试在SSMS中执行此操作并选择将操作编写为脚本而不是直接应用它。您将发现它创建一个临时表,其identity属性设置为true(以及其他所有内容),将您的数据从实时表复制到临时表中,删除实时表,并将临时表重命名为是现场表。您需要与SMO做类似的事情。

复制表很容易:迭代列,索引,外键等,并以这种方式创建新表(在调用Create()之前,请注意正确设置身份属性)。要移动数据,请查看Transfer类。完成后,它会被删除并重命名(如果您想要安全,则重命名和重命名)。

我有点惊讶的是,SMO并没有以某种方式做到这一点(因为SSMS在封面下使用了SMO)。如果我发现其他东西让它自动执行此操作,我会告诉您。

答案 1 :(得分:0)

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

要将标识值插入SQL Server中的表,您必须告诉数据库允许您执行此操作。语法是:

Set Identity_Insert [table] ON

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

Set Identity_Insert [table] OFF