以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  sql查询问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=161325)

--  作者:happyft
--  发布时间:2021/3/13 11:14:00
--  sql查询问题
查将数据库中包含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值查询出来汇总到一个表中,但总提示出错,哪里写的不对?

谢谢!



--  作者:有点蓝
--  发布时间:2021/3/13 12:11:00
--  
        EXEC (\' INSERT into \' + @tmp1+\' (\' + tbName +\' ,\'+  colName +\' ,\'+  colValue +\' ) SELECT \'\'\' + @tbName + \'\'\',\'\'\' + @colName + \'\'\',ID FROM \' + @tbName  );

--  作者:HappyFt
--  发布时间: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 )
...

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






--  作者:有点蓝
--  发布时间:2021/3/13 17:09:00
--  
https://www.cnblogs.com/luckyting/articles/7717871.html

--  作者:HappyFt
--  发布时间: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值,这样每次循环执行的结果集如何汇总到一个表中来呢? 还是建立一个数据表是最简单的办法是不?

--  作者:有点蓝
--  发布时间:2021/3/13 17:34:00
--  
建立一个数据表吧