Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
暂时禁用SQL Server中的空约束_Sql_Sql Server - Fatal编程技术网

暂时禁用SQL Server中的空约束

暂时禁用SQL Server中的空约束,sql,sql-server,Sql,Sql Server,我使用的脚本包括对数据库的更改,这些更改会使数据库暂时处于无效状态。目前,我在脚本开始时禁用所有约束,然后在脚本结束时使用以下代码重新启用它们: /*** Disable all constraints ***/ EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" /*** Enable all constraints ***/ EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK

我使用的脚本包括对数据库的更改,这些更改会使数据库暂时处于无效状态。目前,我在脚本开始时禁用所有约束,然后在脚本结束时使用以下代码重新启用它们:

/*** Disable all constraints ***/
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
/*** Enable all constraints ***/
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
但这并没有禁用空约束,因为我从阅读中了解到,空约束的处理方式与FK约束不同

我认为有必要修改所有表,使其允许null,然后在脚本末尾再次修改它们

我不能“硬编码”表的名称,因为我没有这些信息,所以我不能做很多陈述,比如:

ALTER TABLE someTable ALTER COLUMN someColumn INT NULL
它需要是动态的。有什么办法可以做到这一点吗

编辑:
我无法处理的一个场景是向现有表添加新的NOTNULL列。我无法控制添加此列的脚本(它是由自动工具创建的),创建的脚本是
ALTER TABLE someTable add sometcolumn INT not NULL
,在此语句之后,会发生一些删除/插入/更新,使
someTable
处于有效状态,但是错误发生在
ALTER
语句上,这里有一个脚本,我从type
text
中选择所有字段,使其成为
varchar(max)
。 您的方法类似,但您需要根据自己的用途对其进行修改

  • 更改SQL以找到所需的正确c.xtype

  • 将WHERE语句修改为您的需求将@sql\U select更改为您的需求

  • 打印它以进行测试,然后如果需要,取消对EXEC的注释

我的代码(用于编辑):


如果我有更多的时间,我可能会编辑以满足您的需求。

在暂存表中构建正确的表示形式不是更好吗,然后在满足约束条件后将其传输到实际表中?
ALTER TABLE someTable ADD someColumn INT NOT NULL
对于包含任何行的表来说都不是有效的脚本。如果您无法控制此脚本,它将始终出错。我一直在试图找到某种方法,告诉SQL Server忽略该检查,就像我提到的脚本可以忽略FK约束一样,但是如果绝对不可能忽略空约束,您可以提供一些文档链接,我会接受您的回答您的列中有约束吗?然后你必须先删除它们,然后再重新创建。我做得和我在下面的回答一样好。
-- change all text to varchar(max)
DECLARE @sql_select NVARCHAR(MAX);
DECLARE @table_name VARCHAR(MAX);
DECLARE @column_name VARCHAR(MAX);

DECLARE local_column_update_cursor CURSOR FOR

SELECT c.name as column_name, o.name as table_name 
FROM dbo.syscolumns c, dbo.sysobjects o
WHERE c.xtype IN (35,99) -- text/ntext
  AND o.id = c.id
  AND OBJECTPROPERTY(o.id, N'IsUserTable') = 1

OPEN local_column_update_cursor
FETCH NEXT FROM local_column_update_cursor
INTO @column_name, @table_name

WHILE @@FETCH_STATUS = 0
BEGIN

SET @sql_select = 'ALTER TABLE ' + @table_name + ' ALTER COLUMN ' + @column_name + ' VARCHAR(MAX)'
--EXEC sp_executesql @sql_select
PRINT @sql_select

FETCH NEXT FROM local_column_update_cursor
INTO @column_name, @table_name
END

DEALLOCATE local_column_update_cursor

GO