我正在使用SQL Server 2005 Express。我想使用SMO循環訪問數據庫中的每個表並將每個Char列更改爲Varchar列。如果列是主鍵的成員,則需要在更改列的數據類型之前首先刪除主鍵。然後我需要重新創建索引。這裏是我嘗試使用代碼:如何使用SMO與SQL Server刪除並重新創建主鍵索引?
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做的事情的好方法?我使用索引的腳本方法刪除它之前,我試圖腳本索引,但它引發異常與消息「The Index'PK_table1'引用不存在的列'[table1]。[所有者]'」。業主欄明確存在。
如果某列存在,而SQL表示它不存在,那麼我會查看安全問題 - 您的命令在哪些上下文下運行? – Sam 2010-07-29 16:48:13
這些命令在系統管理員登錄(sa)下運行。 – YWE 2010-07-29 22:05:25
你知道的更復雜。如果主鍵在外鍵關係中引用,則不能簡單地刪除主鍵。因此,對於每個PK,您需要找到所有FK引用,刪除這些引用,刪除PK,更改數據類型,然後按相反順序將它們添加回去。 – Thomas 2010-08-10 04:03:10