当前位置: 首页 > 面试题库 >

更新现有表中的ANSI_NULLS选项

史弘致
2023-03-14
问题内容

在我们的数据库中,有一个用创建的表ANSI_NULLS OFF。现在,我们使用此表创建了一个视图。我们想为此视图添加聚簇索引。

创建聚簇索引时,它会显示一个错误,例如无法创建索引,因为此特定表的ANSI_NULL已关闭。

该表包含大量数据。因此,我想将此选项更改为ON,而不会丢失任何数据。

有什么方法可以更改表来修改此选项。请提出您的建议。


问题答案:

这是交叉发布在数据库管理员上的,所以我也可以在这里发布我的答案,以帮助将来的搜索者。

可以使用仅更改元数据(即,无需将所有数据迁移到新表)进行更改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;

警告:当表包含IDENTITY列时,您需要重新设定IDENTITY值。SWITCH TO将重置身份列的种子,并且如果您对身份没有UNIQUE或PRIMARY
KEY约束(例如,在SQL 2014中使用CLUSTERED COLUMNSTORE索引时),您将不会立即注意到它。您需要使用DBCC
CHECKIDENT(“ dbo.YourTable”,RESEED,[重新设置的种子值])来再次正确设置种子的值。



 类似资料:
  • 问题内容: 也许我弄错了,但是我虽然JPA能够更新现有表(更改了添加列的模型),但在我的情况下却无法正常工作。 我可以在日志中看到eclipselink尝试创建它,但是由于它已经存在而失败。它不会尝试更新以添加该列,而是继续进行。 这是带有更改的表(添加了在线列) 此后,继续进行以下操作。 我是在做错什么还是错误? 问题答案: 从EclipseLink 2.4开始,您可以在持久性单元的规范中使用它

  • 我正在尝试在现有列表中添加一个新项目,但无法添加。当我调试时,它显示返回为true,但最终新项没有添加到列表中。 我的示例代码如下:Employee employee1=new Employee(5001,“BOB”,financeDept.getDepartment_name());employee2=新员工(5002,“SAM”,FinanceDepartment.getDepartment_

  • 问题内容: 我有一个已经安排好的石英作业。我想更新与之关联的JobDataMap。如果我通过获得JobDataMap ,该地图是否“实时”?即。如果我更改它,它将保留在调度程序中吗?如果没有,我该如何坚持呢? 问题答案: 参见http://www.quartz- scheduler.org/docs/tutorial/TutorialLesson03.html : Job实例可以定义为“有状态”或

  • 我正在与Laravel 5.6与MySql数据库在我的Web应用程序。 我有下面的函数方法来添加顺序, 在我的系统中,我有以下车辆的表名, 现在我需要更新上面的表adtype值从0到1,当点击提交按钮关于上面的addorder函数。那么如何编写代码来更新上面函数中的代码呢???? 我的网址如下...... 路线是,

  • 问题内容: 我的桌子上有很多记录(可能超过500 000或1 000 000)。我在此表中添加了一个新列,我需要使用该表中另一列的相应行值为该列中的每一行填充一个值。 我尝试使用单独的事务来选择每100条记录的下一个块并为其更新值,但是例如,要花费数小时来更新Oracle10中的所有记录。 在不使用某些方言特定功能的情况下,在SQL中执行此操作的最有效方法是什么,因此它可在任何地方(Oracle,

  • 问题内容: 我使用bootstrap multi-select,我想使用ajax更新流选项 要在init中填充我的多选 然后在事件上我想用以下ajax更新我的选项列表 我尝试使用rebuild方法,但是创建后不会触发下拉菜单 使用萤火虫,我可以看到已生成列表,但选择后不会显示 问题答案: 在文档中,我可以阅读: .multiselect(’setOptions’,options)用于在初始化mul