Я использую 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?
Я пытался создать сценарий для индексации перед тем, как удалить его, используя метод индекса Script, но он выдает исключение с сообщением «Индекс« PK_table1 »ссылается на несуществующий столбец« [таблица1]. [Владелец] ».» Столбец владельца явно существует.