zoukankan      html  css  js  c++  java
  • MSSQL中如何用SQL清除所有表的数据(downmoon)?

    有朋友问起:MSSQL中如何用SQL清除所有表的数据?这个需求分三种类型:
    第一:只要数据库中表是空的;
    第二:表是空的,并且自增长列可以从1开始增长。
    第三:表是空的,并且自增长列可以从1开始增长,而且存在表间的约束。
    邀月稍微整理了下,放在这里,便于有需要的朋友参阅。
    其实,这不算什么需求。只要用数据库的生成脚本,几分钟即可生成一个干净的表结构及存储过程、视图、约束等。这里提供了另一种用SQL解决问题的方案。权当是无聊的学习,加深点印象吧。呵呵。
    首先,作一些假设:假设database名为TestDB_2000_2005_2008
    预先准备一些脚本
    Code

    先来看看第一种需求:只要数据库中表是空的。
    这个其实并不难,用一个游标循环得出所有表名,再清除所有表,delete或truncate table
    提供几个语句:以下语句均在SQL2000/SQL2005/SQL2008下使用通过。
    方法甲:

    Code

    方法乙:
    Code

    方法丙:
    Code

    再来看看第二种需求:表是空的,并且自增长列可以从1开始增长
    这种需求其实和第一种差不多。因为我们在以上语句中使用的是truncate table语句,所以,表的自增长列是默认从头重新的。

    关键是第三种需求:表是空的,并且自增长列可以从1开始增长,而且存在表间的约束
    这是个比较头痛的问题。因为外键约束,不能使用truncate table语句,但是,如果使用delete,又不能使自增长列从1开始重排。

    我们不妨先来增加一些约束条件:
    Code

    此时再来执行甲乙丙语句时会提示:“无法截断表 'd',因为该表正由 FOREIGN KEY 约束引用。”

    我们可以这样设想:
    1、先找出没有外键约束的表,truncate
    2、有外键的表,先delete,再复位identity列
    于是得出,
    语句丁(注意没有使用游标
    Code

    小结:除了以上方法,还可以临时禁用外键约束。语句为:
    -- --禁用所有约束
    --
    exec sp_msforeachtable 'alter table ? nocheck CONSTRAINT all'
    --
     --再启用所有外键约束
    --
    exec sp_msforeachtable 'alter table ? check constraint all'

    邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
    助人等于自助!  3w@live.cn
  • 相关阅读:
    Jenkins使用三:管理slave节点(配置SSH公钥和私钥)
    Jenkins使用二:新建任务
    Jenkins使用一:CentOS7安装Jenkins
    CentOS安装MongoDB
    测开之路七十八:shell之函数和参数
    测开之路七十七:shell之if、case、for、while
    测开之路七十六:linux变量和环境变量
    测开之路七十五:linux常用命令
    linux暴露端口可以被外部访问
    WEB框架概述(译)
  • 原文地址:https://www.cnblogs.com/downmoon/p/1564391.html
Copyright © 2011-2022 走看看