Foxtable(狐表)用户栏目专家坐堂 → sql查询问题


  共有3151人关注过本帖树形打印复制链接

主题:sql查询问题

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1926 积分:17397 威望:0 精华:0 注册:2014/7/29 19:09:00
sql查询问题  发帖心情 Post By:2021/3/13 11:14:00 [只看该作者]

查将数据库中包含ID字段的所有表中的ID值查询出来,用了下面的语句,却总是出错
DECLARE @tmp1 TABLE   --声明表变量
    (
      tbName VARCHAR(30) ,
      colName VARCHAR(16) ,
      colValue INT
    ); 
---用于存储变量的游标
DECLARE @tbName CHARACTER(30) ,
    @colName CHARACTER(16);    
--声明游标查询所有包含ID字段的表
DECLARE tbnames CURSOR
FOR
    ( SELECT    OBJECT_NAME(id) tbName ,
                name AS colName
      FROM      syscolumns
      WHERE     ( name = 'ID' )
                AND id IN ( SELECT  id
                            FROM    sysobjects
                            WHERE   xtype = 'u' )
    );
    --打开游标循环游标变量
OPEN tbnames;
FETCH NEXT FROM tbnames INTO @tbName, @colName;
WHILE @@FETCH_STATUS = 0  
    BEGIN 
        EXEC
        (' INSERT into ' + @tmp1+'
        ( tbName ,
        colName ,
        colValue
        )
        SELECT ' + @tbName + ',' + @colName + ',ID FROM '
        + @tbName
        );
        FETCH NEXT FROM tbnames INTO @tbName, @colName;   --转到下一个游标
    END;    
  --关闭并释放游标   
CLOSE tbnames;
DEALLOCATE tbnames;
SELECT  *
FROM    @tmp1;

红色部份就是想把每一个表中的ID值查询出来汇总到一个表中,但总提示出错,哪里写的不对?

谢谢!



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/13 12:11:00 [只看该作者]

        EXEC (' INSERT into ' + @tmp1+' (' + tbName +' ,'+  colName +' ,'+  colValue +' ) SELECT ''' + @tbName + ''',''' + @colName + ''',ID FROM ' + @tbName  );

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1926 积分:17397 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/3/13 17:00:00 [只看该作者]

如果先新建好一个物理数据表temp_ID,再用下面的语句就没问题:
EXEC (' INSERT into temp_ID (tbName ,tabID ) SELECT ''' + @tbName + ''', ID FROM ' + @tbName  )  --这样可以正确运行

但是用下面的语句声明了一个表变量,插入数据在里面,还是不行
DECLARE @tmp1 TABLE (tbName VARCHAR(30) , ID INT)    --声明表变量
...
EXEC (' INSERT into '+@tmp1+ ' (tbName , ID) SELECT ''' + @tbName + ''', ID FROM ' + @tbName )
...

按老师写的还是不行,总是提示未声明变量什么的,表变量中间红色这部份写法哪里不对?
谢谢






 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/13 17:09:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1926 积分:17397 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/3/13 17:33:00 [只看该作者]

把表变量写到exec里面是可以执行,
EXEC (
        'DECLARE @tmp1 TABLE (tbName VARCHAR(30) ,ID INT); 
        INSERT into @tmp1 SELECT ''' + @tbName + ''', ID FROM ' + @tbName
        );

但问题是要从400多个表中提取ID值,这样每次循环执行的结果集如何汇总到一个表中来呢? 还是建立一个数据表是最简单的办法是不?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/13 17:34:00 [只看该作者]

建立一个数据表吧

 回到顶部