CREATE TABLE dbo.Customers (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, CustomerName NVARCHAR(200));
CREATE INDEX IX_CustomerName ON dbo.Customers(CustomerName);
然后使用 SQL Server 管理表设计器将 CustomerName 列更改为 VARCHAR(200) 而不是 NVARCHAR。默认情况下,当您尝试保存更改(或什至只是生成更改脚本)时,您会收到警告:
不可以。据我所知,更改包含在索引中的列是不可能的(您会收到一条错误消息)。您必须在更改列之前删除索引,然后再次重新应用索引。据我所知,唯一的例外是您可以将列从 更改为
NOT NULL
,NULL
而不必删除索引(反之则不行)。但是,如果您使用 SSMS 更改表,SSMS 可能会删除并为您重新创建索引,但无论如何都不应该删除索引。
在旁注中,如果您有索引视图,请修改视图直到删除视图上的任何索引。
这取决于您用来更改列的方法。我们将从一个简单的表格开始:
然后使用 SQL Server 管理表设计器将 CustomerName 列更改为 VARCHAR(200) 而不是 NVARCHAR。默认情况下,当您尝试保存更改(或什至只是生成更改脚本)时,您会收到警告:
您可以通过单击“工具”、“选项”、“设计器”、“表和数据库设计器”来覆盖 SSMS 中的警告,然后取消选中“防止保存需要重新创建表的更改”框。
这很危险,因为如果您在生产环境中更改了一个表,您最终可能会在 SQL Server 从头重建该表时锁定它。我真的很喜欢 Microsoft 默认启用此选项。
禁用它并再次尝试编辑后,不要保存表 - 而是单击表设计器,生成更改脚本。您收到有关数据丢失的新警告,因为您正在缩减数据类型,从 Unicode 友好数据类型 (NVARCHAR) 向下移动到非 Unicode 数据类型 (VARCHAR)。如果我们忽略该错误,我们可以看到更改脚本。它包括创建新表,将数据移入其中,最后重新创建所有非聚集索引:
如果您使用不同的数据库设计器工具,或者如果您使用不同的数据类型更改,您会得到不同的结果。例如,如果将一个字段从 VARCHAR(MAX) 更改为 INT,您将丢失 VARCHAR(MAX) 字段的全文索引,因为您无法对数字进行全文索引。