就是说,某数据库里各种表,表里只有字段名但没有记录的表都不要,该怎么弄?望详细解答,谢谢。
不是要一个个的表看,是一下子可以过滤掉没有数据的表。
如何可以过滤SQL数据库中表的字段记录为空的表?
答案:3 悬赏:0
解决时间 2021-04-07 06:20
- 提问者网友:白越
- 2021-04-06 15:53
最佳答案
- 二级知识专家网友:湫止没有不同
- 2021-04-06 17:26
declare @cur cursor
declare @n nvarchar(500)
declare @r as int
declare @sql nvarchar(500)
set @cur= cursor for
SELECt name FROM sysobjects WHERe (xtype = 'u')
open @cur
FETCH NEXT FROM @cur INTO @N
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql ='if not exists(SELECt * FROM ' + @n + ') drop table ' + @n
--exec sp_executesql @sql --我先注释了这一行,注意危险,你确认一下
print @sql
FETCH NEXT FROM @cur INTO @N
END
你的问题是改了又改,我的回答也改了又改
上面的回答中: exec sp_executesql @sql 就把没有行的表给删除了,看注释
如果你要列出表的话,如下:
set nocount on
declare @cur cursor
declare @n nvarchar(500)
declare @r as int
declare @sql nvarchar(500)
set @cur= cursor for
SELECt name FROM sysobjects WHERe OBJECTPROPERTY(id, N'IsUserTable') = 1
declare @tb table (name nvarchar(50) ,rows int)
open @cur
FETCH NEXT FROM @cur INTO @N
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = 'select @c=count (*) from ' + @n
print @n
exec sp_executesql @sql, N'@c int output',@c=@r output
insert into @tb (name,rows) values(@n,@r)
FETCH NEXT FROM @cur INTO @N
END
--select * from @tb --如果你要每个表名称和行数
select name from @tb where rows=0 --这样就是没有记录的表名
手工打字,可能出错,还是要你自己测试一下,
要这点分数还真有点难
declare @n nvarchar(500)
declare @r as int
declare @sql nvarchar(500)
set @cur= cursor for
SELECt name FROM sysobjects WHERe (xtype = 'u')
open @cur
FETCH NEXT FROM @cur INTO @N
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql ='if not exists(SELECt * FROM ' + @n + ') drop table ' + @n
--exec sp_executesql @sql --我先注释了这一行,注意危险,你确认一下
print @sql
FETCH NEXT FROM @cur INTO @N
END
你的问题是改了又改,我的回答也改了又改
上面的回答中: exec sp_executesql @sql 就把没有行的表给删除了,看注释
如果你要列出表的话,如下:
set nocount on
declare @cur cursor
declare @n nvarchar(500)
declare @r as int
declare @sql nvarchar(500)
set @cur= cursor for
SELECt name FROM sysobjects WHERe OBJECTPROPERTY(id, N'IsUserTable') = 1
declare @tb table (name nvarchar(50) ,rows int)
open @cur
FETCH NEXT FROM @cur INTO @N
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = 'select @c=count (*) from ' + @n
print @n
exec sp_executesql @sql, N'@c int output',@c=@r output
insert into @tb (name,rows) values(@n,@r)
FETCH NEXT FROM @cur INTO @N
END
--select * from @tb --如果你要每个表名称和行数
select name from @tb where rows=0 --这样就是没有记录的表名
手工打字,可能出错,还是要你自己测试一下,
要这点分数还真有点难
全部回答
- 1楼网友:猎杀温柔
- 2021-04-06 19:00
sql 2005/08 可以用 row_number 处理
-- 测试表
declare @tb_test table(
col1 int,
col2 int
);
insert @tb_test
select 1, 1 union all
select 1, 1 union all
select 1, 2 union all
select 1, 2;
-- 删除处理
with
data as(
select rid = row_number() over(partition by col1, col2 order by col1, col2),
*
from @tb_test
)
delete from data
where rid <> 1;
-- 显示处理结果
select * from @tb_test;
- 2楼网友:统治我的世界
- 2021-04-06 17:37
select * from 表 where 字段1 is not null or 字段1!=''
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯