求一存储过程,要求内详

猿敲月下码 2009-08-16 05:41:42
数据库版本:SQL Server2000

里面有个数据库:pms

要求:

把数据库中的表数据清空,并且添加新数据的时候起始id为1,就是刚刚新建完表的状态

100送上,估计分少了没人搭理。

我晚上一直都在,解决了就结贴
...全文
556 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 sql77 的回复:]
引用 48 楼 thc1987 的回复:
再次总结下:
经过多次测试,40L与45的原理符合我的要求,45L还把有无自增列做了判断,程序更具有健壮性,并且45L的核心代码为存储过程,保存在了数据库中方便调用
问题解决了,结贴去了,辛苦大家了,谢谢
SQL codeif(object_id('pr_DataClear')isnotnull )dropprocedure pr_DataCleargocreateprocedure pr_DataClearasbegintransactiondeclare@cTblNamevarchar(128)declare cur_Clearcursorforselectrtrim(name)from sysobjectswhere type='U'orderby crdatedescopen cur_Cleardeclare@cSQLvarchar(255)fetchnextfrom cur_Clearinto@cTblNamewhile(@@fetch_status=0)beginset@cSQL='delete from'+@cTblNameprint@cSQLexec(@cSQL )if(ident_seed(@cTblName)isnotnull )begindbcc checkident(@cTblName, reseed,0 )print'有种子且成功重置为1'endfetchnextfrom cur_Clearinto@cTblNameendclose cur_Cleardeallocate cur_Clearcommitgo--执行exec pr_DataClear-- 截断日志backuplog pmswith no_logdbcc shrinkdatabase( pms )dbcc updateusage( pms )--查看表空间selectobject_name(id)as 表名,
(rtrim(8*reserved/1024)+'MB')as 总量,
(rtrim(8*dpages/1024)+'MB')as 已使用,
(rtrim(8*(reserved-dpages)/1024)+'MB')as 未使用,
(rtrim(8*dpages/1024-rows/1024*minlen/1024)+'MB' )as 空隙from sysindexeswhere indid=1orderby reserveddesc

这东西很强,收藏了
[/Quote]
对啊 ,为了让其他人也看到,我还是迟点结贴吧
SQL77 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 thc1987 的回复:]
再次总结下:
经过多次测试,40L与45的原理符合我的要求,45L还把有无自增列做了判断,程序更具有健壮性,并且45L的核心代码为存储过程,保存在了数据库中方便调用
问题解决了,结贴去了,辛苦大家了,谢谢
SQL codeif(object_id('pr_DataClear')isnotnull )dropprocedure pr_DataCleargocreateprocedure pr_DataClearasbegintransactiondeclare@cTblNamevarchar(128)declare cur_Clearcursorforselectrtrim(name)from sysobjectswhere type='U'orderby crdatedescopen cur_Cleardeclare@cSQLvarchar(255)fetchnextfrom cur_Clearinto@cTblNamewhile(@@fetch_status=0)beginset@cSQL='delete from'+@cTblNameprint@cSQLexec(@cSQL )if(ident_seed(@cTblName)isnotnull )begindbcc checkident(@cTblName, reseed,0 )print'有种子且成功重置为1'endfetchnextfrom cur_Clearinto@cTblNameendclose cur_Cleardeallocate cur_Clearcommitgo--执行exec pr_DataClear-- 截断日志backuplog pmswith no_logdbcc shrinkdatabase( pms )dbcc updateusage( pms )--查看表空间selectobject_name(id)as 表名,
(rtrim(8*reserved/1024)+'MB')as 总量,
(rtrim(8*dpages/1024)+'MB')as 已使用,
(rtrim(8*(reserved-dpages)/1024)+'MB')as 未使用,
(rtrim(8*dpages/1024-rows/1024*minlen/1024)+'MB' )as 空隙from sysindexeswhere indid=1orderby reserveddesc
[/Quote]
这东西很强,收藏了
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
再次总结下:
经过多次测试,40L与45的原理符合我的要求,45L还把有无自增列做了判断,程序更具有健壮性,并且45L的核心代码为存储过程,保存在了数据库中方便调用
问题解决了,结贴去了,辛苦大家了,谢谢
if( object_id('pr_DataClear') is not null )  	
drop procedure pr_DataClear
go

create procedure pr_DataClear as

begin transaction

declare @cTblName varchar(128)
declare cur_Clear cursor for select rtrim(name) from sysobjects where type = 'U' order by crdate desc

open cur_Clear
declare @cSQL varchar(255)
fetch next from cur_Clear into @cTblName
while( @@fetch_status = 0)
begin
set @cSQL = 'delete from ' + @cTblName
print @cSQL
exec( @cSQL )
if( ident_seed(@cTblName) is not null )
begin
dbcc checkident( @cTblName, reseed, 0 )
print '有种子且成功重置为1'
end
fetch next from cur_Clear into @cTblName
end
close cur_Clear
deallocate cur_Clear
commit
go
--执行
exec pr_DataClear

-- 截断日志
backup log pms with no_log
dbcc shrinkdatabase( pms )
dbcc updateusage( pms )

--查看表空间
select

object_name(id) as 表名,
(rtrim(8*reserved/1024) + 'MB') as 总量,
(rtrim(8*dpages/1024) + 'MB') as 已使用,
(rtrim(8*(reserved-dpages)/1024) + 'MB') as 未使用,
(rtrim(8*dpages/1024-rows/1024*minlen/1024) + 'MB' ) as 空隙

from sysindexes
where indid=1
order by reserved desc
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
45L的核心代码跟40L差不多吧
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 feixianxxx 的回复:]
引用 42 楼 thc1987 的回复:
可以了,总结下:
将40L的代码改下就可以了,这样约束也没用问题,自增列也从0开始了,高兴啊
SQL codedeclare curcursorforselect[name]from sysobjectswhere xtype='u'declare@namevarchar(256)declare@sqlvarchar(8000)open curfetchnextfrom curinto@namewhile(@@fetch_status=0)beginset@sql='delete from'+@name+' dbcc checkident ('+@name+',reseed,0)'print@sqlexec (@sql)fetchnextfrom curinto@nameendclose curdeallocate cur

这样可以了?

数据清空  约束还在?
[/Quote]
数据确实没了,约束确实还在。。。
Tomzzu 2009-08-17
  • 打赏
  • 举报
回复
如下解决了五个问题
1. 清空数据
2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表
3. 种子问题, 如果表存在种子重设为0, 如不存在就不操作
4. 加了事务, 中间报错, 有后悔机会
5. 截断日志功能, 因为使用delete, 删除后日志文件会增大, 可以不使用


if( object_id('pr_DataClear') is not null )
drop procedure pr_DataClear
go
create procedure pr_DataClear
as
begin transaction
declare @cTblName varchar(128)
declare cur_Clear cursor for select rtrim(name) from sysobjects where type = 'U' order by crdate desc

open cur_Clear
declare @cSQL varchar(255)
fetch next from cur_Clear into @cTblName
while( @@fetch_status = 0)
begin
set @cSQL = 'delete from ' + @cTblName
print @cSQL
exec( @cSQL )

if( ident_seed(@cTblName) is not null )
begin
dbcc checkident( @cTblName, reseed, 0 )
print '有种子且成功重置为1'
end
fetch next from cur_Clear into @cTblName
end
close cur_Clear
deallocate cur_Clear
commit
go

-- 清空所有表数据
exec pr_DataClear

-- 截断日志
backup log LZ的数据库 with no_log
dbcc shrinkdatabase( LZ的数据库 )
dbcc updateusage( LZ的数据库 )

-- 查看表空间(概数)
select object_name(id) as 表名, (rtrim(8*reserved/1024) + 'MB') as 总量, (rtrim(8*dpages/1024) + 'MB') as 已使用,
(rtrim(8*(reserved-dpages)/1024) + 'MB') as 未使用, (rtrim(8*dpages/1024-rows/1024*minlen/1024) + 'MB' ) as 空隙
from sysindexes
where indid=1
order by reserved desc

SQL77 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 thc1987 的回复:]
可以了,总结下:
将40L的代码改下就可以了,这样约束也没用问题,自增列也从0开始了,高兴啊
SQL codedeclare curcursorforselect[name]from sysobjectswhere xtype='u'declare@namevarchar(256)declare@sqlvarchar(8000)open curfetchnextfrom curinto@namewhile(@@fetch_status=0)beginset@sql='delete from'+@name+' dbcc checkident ('+@name+',reseed,0)'print@sqlexec (@sql)fetchnextfrom curinto@nameendclose curdeallocate cur
[/Quote]
这个好像只是将set @sql='delete from '+@name +' dbcc checkident ('+@name+',reseed,0)'
变成0吧,其他的都没弄
feixianxxx 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 thc1987 的回复:]
可以了,总结下:
将40L的代码改下就可以了,这样约束也没用问题,自增列也从0开始了,高兴啊
SQL codedeclare curcursorforselect[name]from sysobjectswhere xtype='u'declare@namevarchar(256)declare@sqlvarchar(8000)open curfetchnextfrom curinto@namewhile(@@fetch_status=0)beginset@sql='delete from'+@name+' dbcc checkident ('+@name+',reseed,0)'print@sqlexec (@sql)fetchnextfrom curinto@nameendclose curdeallocate cur
[/Quote]
这样可以了?

数据清空 约束还在?
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
可以了,总结下:
将40L的代码改下就可以了,这样约束也没用问题,自增列也从0开始了,高兴啊
declare cur cursor for 
select [name] from sysobjects where xtype = 'u'
declare @name varchar(256)
declare @sql varchar(8000)
open cur
fetch next from cur into @name
while(@@fetch_status=0)
begin
set @sql='delete from '+@name +' dbcc checkident ('+@name+',reseed,0)'
print @sql
exec (@sql)
fetch next from cur into @name
end
close cur
deallocate cur
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 chencane 的回复:]
SQL code--定义游标,把当前数据库中的用户表,取出来,放到游标cur中。declare curcursorforselect[name]from sysobjectswhere xtype='u'--声明表名变量declare@namevarchar(256)--要执行:删除表数据,重置表标识列的sql语句declare@sqlvarchar(8000)--打开游标,循环遍历表,执行sql¡­
[/Quote]

我的执行结果:
delete from operators dbcc checkident (t,reseed,0)
delete from productionPlans dbcc checkident (t,reseed,0)
delete from qualityReport dbcc checkident (t,reseed,0)
delete from qualityReportData dbcc checkident (t,reseed,0)
delete from desiredValues dbcc checkident (t,reseed,0)
delete from dtproperties dbcc checkident (t,reseed,0)
delete from productIndex dbcc checkident (t,reseed,0)

但是数据依然存在,我放在查询分析器里面运行,没错吧
chencane 2009-08-17
  • 打赏
  • 举报
回复


--定义游标,把当前数据库中的用户表,取出来,放到游标cur中。
declare cur cursor for
select [name] from sysobjects where xtype = 'u'
--声明表名变量
declare @name varchar(256)
--要执行:删除表数据,重置表标识列的sql语句
declare @sql varchar(8000)
--打开游标,循环遍历表,执行sql语句。
open cur
fetch next from cur into @name
while(@@fetch_status=0)
begin
set @sql='delete from '+@name +' dbcc checkident (t,reseed,0)'
print @sql
--exec (@sql)
fetch next from cur into @name
end
close cur
deallocate cur


猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 sql77 的回复:]
引用 35 楼 thc1987 的回复:
引用 32 楼 feixianxxx 的回复:
测试成功
26 楼 EXEC sp_MSForEachTable 'truncate TABLE ? ' 会出错
修改下 就可以
SQL code-- =========================================
-- -----------t_mac 小编---------------------------------------希望有天成为大虾----
-- =========================================
-->测试IFOBJECT_ID('tb')ISNOTNULLDROPTABLE tbGOCREATETABLE tb(  aintprimarykey )goIFOBJECT_ID('ta')ISNOTNULLDROPTABLE taGOCREATETABLE ta(  bintprimarykey,aintreferences tb(a) )goinsertinto tbselect1unionallselect2insertinto taselect1,1unionallselect4,2goinsertinto taselect3,3/**/--约束暂时失去作用EXEC sp_MSForEachTable'ALTER TABLE ? nocheck constraint ALL'--NOCHECK Constraints
--清空exec sp_msforeachtable "deletefrom  ?"select*from tbselect*from ta/*
a
-----------*//*
b          a
----------- --------*/


经测试,清空完后,添加一项数据,自增id还是按照原来的值递增

看看果果的,其实觉得楼主这样做不如直接新建立一数据库了
[/Quote]
弱弱的问一句,哪位是果果?
chencane 2009-08-17
  • 打赏
  • 举报
回复
不建议删除约束。。
可以尝试这种方法:先找出数据库中的表,删除表中的数据,再把表中的标识列(自增列种子重新设定为1)

declare cur cursor for
select [name] from sysobjects where xtype = 'u'
declare @name varchar(256)
declare @sql varchar(8000)
open cur
fetch next from cur into @name
while(@@fetch_status=0)
begin
set @sql='delete from '+@name +' dbcc checkident (t,reseed,0)'
print @sql
--exec (@sql)
fetch next from cur into @name
end
close cur
deallocate cur

猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
我们也可以用微软不公开的存储过程来实现此操作,这就非常简单了,代码如下:
--Removed CHECK Constraint-------------------------
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' --NOCHECK Constraints
print 'All Constraints Disable'
go

--truncate All tables if trying to empty the database
--- Ensure the T_X_ref database is located on a different database

------------- Truncate All Tables from Model ----------------
-----To limit tables a table with sub model tables must be created and used joins-----
EXEC sp_MSForEachTable 'truncate TABLE ? '
print 'All tables truncated'
go


这个如果有约束的话还是行不通
SQL77 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 thc1987 的回复:]
引用 32 楼 feixianxxx 的回复:
测试成功
26 楼 EXEC sp_MSForEachTable 'truncate TABLE ? ' 会出错
修改下 就可以
SQL code-- =========================================
-- -----------t_mac 小编---------------------------------------希望有天成为大虾----
-- =========================================
-->测试IFOBJECT_ID('tb')ISNOTNULLDROPTABLE tbGOCREATETABLE tb(  aintprimarykey )goIFOBJECT_ID('ta')ISNOTNULLDROPTABLE taGOCREATETABLE ta(  bintprimarykey,aintreferences tb(a) )goinsertinto tbselect1unionallselect2insertinto taselect1,1unionallselect4,2goinsertinto taselect3,3/**/--约束暂时失去作用EXEC sp_MSForEachTable'ALTER TABLE ? nocheck constraint ALL'--NOCHECK Constraints
--清空exec sp_msforeachtable "deletefrom  ?"select*from tbselect*from ta/*
a
-----------*//*
b          a
----------- --------*/


经测试,清空完后,添加一项数据,自增id还是按照原来的值递增
[/Quote]
看看果果的,其实觉得楼主这样做不如直接新建立一数据库了
猿敲月下码 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 feixianxxx 的回复:]
测试成功
26 楼 EXEC sp_MSForEachTable 'truncate TABLE ? ' 会出错
修改下 就可以
SQL code-- =========================================
-- -----------t_mac 小编---------------------------------------希望有天成为大虾----
-- =========================================
-->测试IFOBJECT_ID('tb')ISNOTNULLDROPTABLE tbGOCREATETABLE tb( aintprimarykey )goIFOBJECT_ID('ta')ISNOTNULLDROPTABLE taGOCREATETABLE ta( bintprimarykey,aintreferences tb(a) )goinsertinto tbselect1unionallselect2insertinto taselect1,1unionallselect4,2goinsertinto taselect3,3/**/--约束暂时失去作用EXEC sp_MSForEachTable'ALTER TABLE ? nocheck constraint ALL'--NOCHECK Constraints
--清空exec sp_msforeachtable "deletefrom ?"select*from tbselect*from ta/*
a
-----------*//*
b a
----------- --------*/
[/Quote]

经测试,清空完后,添加一项数据,自增id还是按照原来的值递增
appleller 2009-08-16
  • 打赏
  • 举报
回复
xuexi
xiaozejun 2009-08-16
  • 打赏
  • 举报
回复
这个问题正在学习中 过来向高手学习学习 帮顶 楼主解决问题后 请记得把解决的方法详细说一下 让我们也好好学习
feixianxxx 2009-08-16
  • 打赏
  • 举报
回复
测试成功
26 楼 EXEC sp_MSForEachTable 'truncate TABLE ? ' 会出错
修改下 就可以
-- =========================================
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================
-->测试
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( a int primary key )
go

IF OBJECT_ID('ta') IS NOT NULL
DROP TABLE ta
GO
CREATE TABLE ta( b int primary key,a int references tb(a) )
go
insert into tb select 1 union all select 2
insert into ta select 1,1 union all select 4,2
go
insert into ta select 3,3
/*
*/
--约束暂时失去作用
EXEC sp_MSForEachTable 'ALTER TABLE ? nocheck constraint ALL ' --NOCHECK Constraints
--清空
exec sp_msforeachtable "delete from ?"
select * from tb
select * from ta
/*
a
-----------
*/
/*
b a
----------- --------
*/
feixianxxx 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 feixianxxx 的回复:]
--看到上面 想到这么写了 应该可以了
楼主看下面代码 先把约束都失效 然后清空
SQL codeuse pmsgo--将约束都失效EXEC sp_MSForEachTable'ALTER TABLE ? NOCHECK CONSTRAINT ALL'--清空exec sp_msforeachtable "truncatetable ?"
[/Quote]
不对 还是有问题
加载更多回复(30)

34,596

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧