我们可以使用以下查询来更新 ANSI_NULLS 选项吗?
sp_configure 'allow updates', 1
reconfigure with override
update sysobjects set status = status | 0x20000000 where name = 'tblClient'
Run Code Online (Sandbox Code Playgroud)
我不确定它在做什么。我在寻找解决方案后得到了这个。我们的数据库是 SQL Server 2008。
但是当我运行这个时,我遇到了这样的错误 "Ad hoc updates to system catalogs are not allowed."
请提出您的建议
Mar*_*ith 10
直接更新系统表不受支持且不安全。它们的结构自 2000 年以来发生了变化,因此您的代码无论如何都不会对它们起作用。
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)
然而,一个警告是这并不总是有效。添加带有定义的检查约束CHECK (X <> NULL)会导致它失败
ALTER TABLE SWITCH 语句失败。表 'YourTableNew'在列 'X' 上有一个列级检查约束 'CK_ YourTableNew _X__37A5467C',该约束不可加载用于语义验证。
这是有道理的,因为约束的语义会随着设置而变化。
如果您遇到这种情况,您可以考虑暂时删除有问题的约束等,并在切换后将它们添加回来,或者只是硬着头皮以更传统的方式重新创建表。
| 归档时间: |
|
| 查看次数: |
4080 次 |
| 最近记录: |