`
dengbaoleng
  • 浏览: 1133295 次
文章分类
社区版块
存档分类
最新评论

处理SQL 2008/08 中的OUTPUT与CHECK约束冲突的问题

 
阅读更多

SQL Server 2005中,新增的OUTPUT子句极大地提高了数据转移的方便性,不过很遗憾的是, OUTPUT子句的输出表不能包含启用状态的CHECK约束。这未免让人觉得很不爽。不过,在实际使用过程中,却发现了一个很奇怪的问题,某些具有启用状态的CHECK约束的表确实无法用于OUTPUT子句,而某些表却是可以的,经过对比,发现了这个很奇怪现象的原因,使得可以把有启用状态的CHECK约束的表用于OUTPUT子句。

下面是演示。

USE tempdb;

GO

-- 建立测试表

CREATE TABLE dbo.tb_source(

id int

);

CREATE TABLE dbo.tb_target(

id int,

CONSTRAINT CHK__tb_target__id

CHECK(

id > 0)

);

GO

-- OUTPUT 测试1

DELETE dbo.tb_source

OUTPUT deleted.*

INTO dbo.tb_target;

/*-- 会收到错误

消息333,级别16,状态1,第3

OUTPUT INTO 子句的目标表'dbo.tb_target' 不能具有任何启用的检查约束或任何启用的规则。找到检查约束或规则'CHK__tb_target__id'

--*/

GO

-- 禁用和启用约束

ALTER TABLE dbo.tb_target

NOCHECK CONSTRAINT ALL;

ALTER TABLE dbo.tb_target

CHECK CONSTRAINT ALL;

GO

-- OUTPUT 测试2

DELETE dbo.tb_source

OUTPUT deleted.*

INTO dbo.tb_target;

/*-- 测试成功

(0 行受影响)

--*/

GO

-- 验证CHECK 约束是否正常工作

INSERT dbo.tb_target

VALUES(

-1);

/*-- 结果(违反约束)

消息547,级别16,状态0,第3

INSERT 语句与CHECK 约束"CHK__tb_target__id"冲突。该冲突发生于数据库"tempdb",表"dbo.tb_target", column 'id'

语句已终止。

--*/

GO

-- 验证OUTPUT , CHECK 约束是否正常工作

INSERT dbo.tb_source

VALUES(

-1);

DELETE dbo.tb_source

OUTPUT deleted.*

INTO dbo.tb_target;

/*-- 结果(违反约束)

(1 行受影响)

消息547,级别16,状态0,第6

DELETE 语句与CHECK 约束"CHK__tb_target__id"冲突。该冲突发生于数据库"tempdb",表"dbo.tb_target", column 'id'

语句已终止。

--*/

GO

-- 删除测试

DROP TABLE dbo.tb_source, dbo.tb_target;

从测试可以看出,只要CHECK约束是使用WITH NOCHECK启用的,则可以作为OUTPUT子句的输出表(与微软给的错误提示信息显示不一样)。

而且这种情况,同样适用于使用WITH NOCHECK创建的约束,参考下面的脚本。

USE tempdb;

GO

-- 建立测试表

CREATE TABLE dbo.tb_source(

id int

);

CREATE TABLE dbo.tb_target(

id int

);

ALTER TABLE dbo.tb_target

WITH NOCHECK

ADD CONSTRAINT CHK__tb_target__id

CHECK(

id > 0);

GO

-- OUTPUT 测试

DELETE dbo.tb_source

OUTPUT deleted.*

INTO dbo.tb_target;

/*-- 测试成功

(0 行受影响)

--*/

GO

-- 删除测试

DROP TABLE dbo.tb_source, dbo.tb_target;

注:
1.
默认情况下,建立约束使用的是WITH CHECK,而启用约束使用的是WITH NOCHECK
2. WITH NOCHECK
只是确定在建立(启用)约束时,是否检查表中的现有数据,对新进的数据没有影响;
3. WITH NOCHECK
会导致分区视图失败。

分享到:
评论

相关推荐

    check约束的文档

    check约束

    SQL2005/2008启动服务器图标

    像SQL2000一样的启动图标也可以出现在SQL2005/2008上面,小小一个插件搞定

    数据库可视化工具SQL Workbench/J Build 118

    SQL Workbench/J 是一款小巧精悍的数据库可视化工具,它支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等多种数据库,而且支持缓存SQL文件,还有很强大的快捷键(如Ctrl+R美化SQL、自动完成提示、执行选中SQL、...

    创建与删除SQL约束或字段约束SQL约束控制

    创建与删除SQL约束或字段约束SQL约束控制 1)禁止所有表约束的SQL select ''alter table ''+name+'' nocheck constraint all'' fromwhere type=''U'' 2)删除所有表数据的SQL select ''TRUNCATE TABLE '...

    PHP操作mysql+mssql(sql2000/2005)+sqlsrv(sql2005/2008)三个类库,直接方便调用即可

    PHP操作mysql+mssql(sql2000/2005)+sqlsrv(sql2005/2008)三个操作类库,下载下来以后直接调用类,直接使用里面函数即可使用,我都已经测试通过!分别在xp,服务器2003/2008,windows7下都测试通过,只需要您把运行...

    SQL Server中Check约束的学习教程

    CHECK约束指在表的列中增加额外的限制条件。 注: CHECK约束不能在VIEW中定义。CHECK约束只能定义的列必须包含在所指定的表中。CHECK约束不能包含子查询。 创建表时定义CHECK约束 1.1 语法: CREATE TABLE table_...

    SQLSserver2008 上

    5、SQL视频-T-SQL语言与SQL语言的区别 ? 6、SQL 2008视频教程-T-SQL语句1 ? 7、SQL 2008视频教程-T-SQL语句2 ? 8、SQL 2008视频教程-T-SQL语句3 ? 9、SQL 2008视频教程-T-SQL语句4 ? 10、T-SQL...

    关于sql脚本导入Oracle时重复生成check约束的问题解决

    主要给大家介绍了关于sql脚本导入Oracle时重复生成check约束的问题解决方法,文中给出了详细的检查步骤,对大家理解和解决这个问题具有很好的帮助,需要的朋友们下面来一起看看吧。

    Sqlserver2000经典脚本

    │ 3.6.2 字符串在编号查询中的应用示例及常见问题.sql<br/>│ │ 3.6.3 动态参数的存储过程示例.sql<br/>│ │ 3.6.4 动态他Transact-SQL语句处理中的常见问题演示.sql<br/>│ │ 3.7.3 text与ntext字段的复制和...

    sql完整性约束参数的使用

    (2)CHECK约束(检查约束):通过逻辑表达式判断限制插入到列中的值。 (3)PRIMARY KEY约束(主键约束):不允许数据库表在指定列上具有相同的值,且不允许有空值 (4)FOREIGN KEY约束(外键约束):定义数据库表...

    SQL SERVER 2005/2008 Express Profiler

    十分好用的sql server profiler 事件跟踪器

    SQL Server中约束与触发器差异比较.pdf

    SQL Server中约束与触发器差异比较.pdf

    SQL server 2008 阻塞查询与处理

    SQL server 2008 阻塞查询与处理

    SQL Server数据库技术大全 电子书

    1.4.3 在SSMS中使用T-SQL/17 1.4.4 使用SSMS管理服务器和脚本/18 1.5 SQL Server 2008的其他工具/19 1.5.1 使用配置管理器配置数据库/19 1.5.2 使用SQL Server Profiler跟踪数据库/22 1.5.3 使用SQL Server 2008联机...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    13、2007.11.28 更正SQLServer下处理sql_variant、uniqueidentifier类型字段问题。 14、2007.11.28 更正数据库迁移自定义数据库链接问题。 15、2007.11.29 更正根据外键引用关系进行数据表排序问题。 ...

    Windows 2008 R2 环境 配置安装SQL 2008和金蝶K/3V12.3

    Windows 2008 R2 环境 配置安装SQL 2008和金蝶K/3V12.3教程

    SQL SERVER 2000中的列级约束与表级约束

    SQL Server 2000中的列级约束与表级约束 在SQL Server 2000中有5 种约束: 主键约束(primary key constraint) 唯一性约束(unique constraint) 检查约束(check constraint) 缺省约束(default constraint) ...

    SQL Server维护

    Windows 2008中安装SQL 2008 46 常见问题 49 安装过程中提示有文件或进程挂起 49 使用windows账号可以登录,可是sa没法登陆 49 本地能连接上,其他电脑不能连接 52 安装过程中提示性能计数器错误 52 二、 SQL Server...

    SQL Server 2008应用实践教程案例与素材

    本书以SQL Server 2008为平台,以图书管理系统数据库作为引导,介绍 SQL Server数据库的主要内容。SQL Server学习效率较高,教学时数比较少,便于学生较快掌握SQL Server。本书在介绍功能的同时通过超链接关联知识点...

    SQL Server中使用Check约束提升性能

    在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能。  在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划,因此元数据越多,则执行计划...

Global site tag (gtag.js) - Google Analytics