【问题标题】:Alter column identity with Microsoft.SqlServer.Smo使用 Microsoft.SqlServer.Smo 更改列标识
【发布时间】:2014-10-31 23:14:16
【问题描述】:

我试图使用 Microsoft.SqlServer.Smo 从没有依赖关系的表中更改列 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 { }
}

【问题讨论】:

  • 您无法在现有列中添加或删除IDENTITY。由于这在 T-SQL 中是不可能的,因此使用 SMO 也是不可能的.....

标签: c# sql-server


【解决方案1】:

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

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

我有点惊讶 SMO 不会以某种方式在幕后执行此操作(因为 SSMS 在幕后使用 SMO)。如果我找到其他可以让它自动执行此操作的东西,我会告诉你的。

【讨论】:

  • 有一个 way to do it in SQL 没有所有的复制恶作剧,但我不确定是否有一种体面的方法可以通过 SMO 复制该技术。
  • 谢谢,实际上 SSMS 会按照您的说法删除并复制一个新表。我必须为我尝试导出的每个表制作一个类似于 SSMS 的脚本
【解决方案2】:

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

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

Set Identity_Insert [table] ON

完成后,您需要再次将其关闭。

Set Identity_Insert [table] OFF

【讨论】:

  • 我不会尝试更新或插入新记录。我试图用另一个数据库中的数据为预加载的列创建一个标识,但是这个新表没有任何依赖关系,我不知道管理工作室如何在不删除任何对象的情况下做到这一点
  • 如果您从另一个数据库复制数据,您在数据库术语中所做的就是将数据插入到表中。为此,您需要将 Identity Insert 设置为 on。请参阅我对上述答案的编辑。
猜你喜欢
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多