无论如何没有办法将查询到的记录数赋给一个变量 ???????
以下SQL 脚本可以查询Northwind数据库中所有用户表和用户表的记录数。
我想把记录数为0的用户表删除(实际工作中因为用户表数量太多了,无法手工删除),
可是无论如何没有办法将查询到的记录数赋给一个变量。
如果能在这段脚本的游标处理语句中将对应数据表的记录数购赋给一个变量,就可以通过对该变量的判断,
决定是否删除该表。
USE Northwind
DECLARE tnames_cursor CURSOR
FOR
SELECT name
FROM sysobjects
WHERE type = 'U' order by name
OPEN tnames_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename)
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' + @tablename )
PRINT ' '
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
------------ 问题的关键是 :“没有办法将查询到的记录数赋给一个变量。 或者是如何在这段脚本的游标处理语句中将对应数据表的记录数购赋给一个变量 ” !!!!!!
问题点数:20、回复次数:9Top
1 楼rivery(river)回复于 2005-08-03 13:19:09 得分 0
使用sp_executesql
declare @tablename varchar(100)
select @tablename='a'
declare @sql nvarchar(1000)
declare @par nvarchar(100)
set @sql=N'SELECT @sumcount = count(*) FROM '+@tablename
set @par=N'@sumcount int output'
declare @re_int int
exec sp_executesql @sql,@par,@re_int out
select @re_int
Top
2 楼coolingpipe(冷箫轻笛)回复于 2005-08-03 13:23:04 得分 0
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' + @tablename )
这句话没有问题?
总的来说看不懂楼主说的什么意思!Top
3 楼symboltome(符号)回复于 2005-08-03 13:25:11 得分 0
关键是 “@tablename” 是我通过 其他方法查找出来的 动态变化的呀 !
如 我查询 的到 “bb" 表 数据为0, 那么 @tablename 的值 为 bbTop
4 楼symboltome(符号)回复于 2005-08-03 13:28:16 得分 0
我的意思就是 : 判断一个数据表是否有记录数 ,如果没有就删除掉 !!!Top
5 楼symboltome(符号)回复于 2005-08-03 13:30:40 得分 0
多谢“ rivery(river)“老兄 , 按照你那样 就没有 自动效果了 ....
我的意思就是 : 判断一个数据表是否有记录数 ,如果没有就删除掉 !!! (需要自动的进行)
Top
6 楼wenhongL(三脚猫)回复于 2005-08-03 14:20:15 得分 0
set @sql='if not exists(select * from '+ @tb+' ) drop table '+@tb
exec (@sql)
Top
7 楼rivery(river)回复于 2005-08-03 18:18:29 得分 20
我是按照你的思路(使用游标)来写的。
你把你的中间的那部分换成我的,tablname不就是动的了吗?
USE Northwind
DECLARE tnames_cursor CURSOR
FOR
SELECT name
FROM sysobjects
WHERE type = 'U' order by name
OPEN tnames_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename)
declare @sql nvarchar(1000)
declare @par nvarchar(100)
set @sql=N'SELECT @sumcount = count(*) FROM '+@tablename
set @par=N'@sumcount int output'
declare @re_int int
exec sp_executesql @sql,@par,@re_int out
if(@re_int=0)
begin
print @tablename+'没有记录,可以删除'
--如果要删除可以在这里删除。
--exec('drop table '+@tablename)
end
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursorTop
8 楼rivery(river)回复于 2005-08-03 18:21:26 得分 0
我理解搂住的意思是:
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' + @tablename
这各动态sql执行里面的那个count(*)要付给外部的一个变量,从而用这个值来判断是否删除某个表。Top
9 楼wenhongL(三脚猫)回复于 2005-08-04 15:35:48 得分 0
这个不简单吗?
/********************/
set @sql='if not exists(select * from '+ @tb+' ) drop table '+@tb
exec (@sql)Top




