CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

无论如何没有办法将查询到的记录数赋给一个变量 ???????

楼主symboltome(符号)2005-08-03 12:58:01 在 MS-SQL Server / 疑难问题 提问

以下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

相关问题

  • 用sql 查询语句,怎样将返回的记录数传递给一个已定义的delphi变量
  • 求存储过程中模糊查询 like 语句写法:以变量 @categorycode 开头的记录,
  • 如何通过like模糊查询符合传递过来变量的记录(在线等)
  • recordset的filter用法,我无论如何为也无法过滤这个记录集!
  • adodataset加变量查询sqlserver出错
  • 字符串变量的模糊查询?
  • 用输入的变量模糊查询
  • 如何以表名为变量查询
  • 查询时检索不到变量
  • 请问如何在adodc控件属性的 记录源 命令文本 sql语句中引用一个变量作为查询的where 语句的依据?

关键词

  • 查询
  • 脚本
  • 用户
  • tnames
  • tablename
  • 删除
  • 记录数
  • 数据表
  • sumcount
  • par

得分解答快速导航

  • 帖主:symboltome
  • rivery

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo