【发布时间】:2011-03-22 19:02:18
【问题描述】:
我正在使用 SQL Server 2005 Express。我想使用 SMO 循环遍历数据库中的每个表并将每个 Char 列更改为 Varchar 列。如果列是主键的成员,我需要先删除主键,然后再更改列的数据类型。然后我需要重新创建索引。这是我尝试使用的代码:
foreach (Table table in database.Tables)
{
Index pk = table.Indexes.Cast<Index>().SingleOrDefault(index => index.IndexKeyType == IndexKeyType.DriPrimaryKey);
if (pk != null)
{
pk.Drop();
table.Alter();
}
foreach (Column column in table.Columns.Cast<Column>().Where(column => column.DataType.SqlDataType == SqlDataType.Char))
{
column.DataType = new DataType(SqlDataType.VarChar, column.DataType.MaximumLength);
}
table.Alter();
if (pk != null)
{
pk.Create();
}
}
但是当我尝试创建索引时,我收到一条异常消息“无法访问 Microsoft.SqlServer.Management.Smo.Index '[PK_table1]' 的属性或方法,因为它已被删除。”那么有没有一种很好的方法来完成我想用 SMO 做的事情?
在使用 Index 的 Script 方法删除索引之前,我尝试编写索引脚本,但它引发异常并显示消息“索引 'PK_table1' 引用不存在的列 '[table1].[owner]'”。所有者列显然存在。
【问题讨论】:
-
如果某个列存在而 SQL 说它不存在,我会考虑安全问题 - 您的命令在什么上下文环境下运行?
-
命令在系统管理员登录(sa)下运行。
-
你知道的更复杂。如果在外键关系中引用了主键,则不能简单地删除它。因此,对于每个 PK,您需要找到所有 FK 引用,删除这些引用,删除 PK,更改数据类型,然后以相反的顺序添加它们。
-
@Thomas。那是真实的。但是这个数据库中没有外键。
标签: c# .net sql-server-2005 smo