Mah*_* KP 13 sql clustered-index sql-server-2008 ansi-nulls
在我们的数据库中有一个用它创建的表ANSI_NULLS OFF.现在我们使用此表创建了一个视图.我们想为此视图添加聚簇索引.
在创建聚簇索引时,它显示的错误就像无法创建索引一样,因为ANSI_NULL对于此特定表是关闭的.
该表包含大量数据.所以我想将此选项更改为ON而不会丢失任何数据.
有没有办法改变表来修改这个选项.请提出你的建议.
Mar*_*ith 18
这是在数据库管理员上交叉发布的,所以我也可以在这里发布我的答案,以帮助未来的搜索者.
它可以作为仅元数据更改(即不将所有数据迁移到新表)使用ALTER TABLE ... SWITCH.
示例代码如下
/*Create table with option off*/
SET ANSI_NULLS OFF;
CREATE TABLE dbo.YourTable (X INT)
/*Add some data*/
INSERT INTO dbo.YourTable VALUES (1),(2),(3)
/*Confirm the bit is set to 0*/
SELECT uses_ansi_nulls, *
FROM sys.tables
WHERE object_id = object_id('dbo.YourTable')
GO
BEGIN TRY
BEGIN TRANSACTION;
/*Create new table with identical structure but option on*/
SET ANSI_NULLS ON;
CREATE TABLE dbo.YourTableNew (X INT)
/*Metadata only switch*/
ALTER TABLE dbo.YourTable SWITCH TO dbo.YourTableNew;
DROP TABLE dbo.YourTable;
EXECUTE sp_rename N'dbo.YourTableNew', N'YourTable','OBJECT';
/*Confirm the bit is set to 1*/
SELECT uses_ansi_nulls, *
FROM sys.tables
WHERE object_id = object_id('dbo.YourTable')
/*Data still there!*/
SELECT *
FROM dbo.YourTable
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
PRINT ERROR_MESSAGE();
END CATCH;
Run Code Online (Sandbox Code Playgroud)
警告:当您的表包含IDENTITY列时,您需要重新设置IDENTITY值.SWITCH TO将重置标识列的种子,如果您对标识没有UNIQUE或PRIMARY KEY约束(例如,在SQL 2014中使用CLUSTERED COLUMNSTORE索引时),您将不会立即注意到它.您需要使用DBCC CHECKIDENT('dbo.YourTable',RESEED,[reseed value])来再次正确设置种子值.
| 归档时间: |
|
| 查看次数: |
11762 次 |
| 最近记录: |