如何使用 sql 语句 遍历 数据库里的表

我要遍历一个数据库(test)里的所有表,判断哪个表里有主键aaa和已知表(表1)里的外键aaa关联,
然后返回那个主键是aaa表里的所有str字段

请问sql语句该怎么写
我把表给出来吧
是MSSQL
表:SampleDetails
1 每款单件用料报表主键 lngSampleDetailsID 主键
2 款号 lngYyGlAID 外键
3 客户 lngCustomerID 外键

表:YyGlA
1 样衣管理表A主键 lngYyGlAID 25主键
2 日期 lngSampleYM 12
3 日期 strSampleYM 25
4 内部编号 strInnerNo 25
5 客户 strCustomerID 25外键
6 客人款号 strCode 25
除了str开头的是nvarchar类型,其他是int类型
我要根据SampleDetails表里和外键lngYyGlAID字段查找关联表里的
strCode字段的所有信息(也就是YyGlA表),表的命名规则有规律,就是按主键字段从第四个开始(主键是lngName,表名就是Name;主键是strName的话,表名就是Name)

---找出这个表中所有类型为varchar型的字段
---不知道你的str型需要对应哪几种类型,只以varchar型为例,其他类型可以查找systypes
---将所需要的type添加到最后的type筛选语句中
select t2.name from
(
---找到主键为aaa,并且与表中aaa字段的外键相对应的表
select b.id
from
(
---找出表1中aaa外键所对应的主表和主键
select rkeyid,rkey
from
(
---找出表1中的所有外键
select a.id,b.* from sysobjects a inner join sysforeignkeys b
on a.id=b.fkeyid
where xtype='U' and name='表1'
)c
inner join
(
---找出aaa字段所在的所有表
select id from syscolumns
where name='aaa'
)d
on c.id=d.id
)a
inner join
(
---找出aaa字段所在的所有表
select id from syscolumns
where name='aaa'
)b
on a.rkeyid=b.id
)t1
inner join syscolumns t2
on t1.id=t2.id
where t2.type=39

回答修改:
根据需求,修改如下
declare @name varchar(255)
---找出主表的名字
set @name=
(select t2.name from
(---找出SampleDetails中的lngYyGlAID外键所对应的主表
---有可能SampleDetails中不只有一个外键
---如果确定只有一个外键,不用和d相交
select rkeyid
from
(
---找出SampleDetails中的所有外键
select a.id,b.* from sysobjects a inner join sysforeignkeys b
on a.id=b.fkeyid
where xtype='U' and name='SampleDetails'
)c
inner join
(
---找出lngYyGlAID字段所在的所有表
select id from syscolumns
where name='lngYyGlAID'
)d
on c.id=d.id)t1
inner join
sysobjects t2
on t1.rkeyid=t2.id)

---从主表中查出strcode字段的所有信息
declare @sql varchar(255)
set @sql='select strCode from '+@name
exec(@sql)
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-15
我的思路
1.先找到 存储 外键约束或者所有约束信息的表或者数据字典 假设为user_re表
2.然后再DESC 查看他有那些字段
3.再找里面相应的字段
a.约束所在表(假设字段为fk_table)
b.外键的话应该有
c.表的字段(fk_col)参照表(ref_table)和参照表的字段(ref_table.col)
这些信息肯定都有了

然后按你的要求就是
select ref_table from user_re
where fk_table = 'T1' and fk_col = 'AAA' and ref_table.col = 'AAA';

那么得到的ref_table列就是你所要找的表了!~
你自己要做的就是去查找相应的数据字典,而且可能信息存在几个表中,那么可能还设计到表的连接。

希望对你有帮助!

SELECT a.strCode FROM YyGlA a,SampleDetails b
WHERE a.lngYyGlAID = b.lngYyGlAID;本回答被提问者采纳
第2个回答  推荐于2017-10-07

有下面几种方法:

使用游标

使用表变量

使用临时表

-- 创建临时表
 3 IF OBJECT_ID('tempdb.dbo.#tempemployees','U') IS NOT NULL DROP TABLE dbo.#tempemployees;
 4 GO
 5 
 6 SELECT empid,firstname,lastname 
 7 INTO dbo.#tempemployees
 8 FROM HR.Employees
 9 ORDER BY empid;
10 
11 --SELECT * FROM dbo.#tempemployees;
12 
13 -- 声明变量
14 DECLARE
15     @empid AS INT,
16     @firstname AS NVARCHAR(10),
17     @lastname AS NVARCHAR(20);
18     
19 WHILE EXISTS(SELECT empid FROM dbo.#tempemployees)
20 BEGIN
21     -- 也可以使用top 1
22     SET ROWCOUNT 1
23     SELECT @empid= empid, @firstname= firstname,@lastname= lastname FROM dbo.#tempemployees;
24     UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid;
25     SET ROWCOUNT 0
26     
27     DELETE FROM dbo.#tempemployees WHERE empid=@empid;
28 END

第3个回答  2008-08-19
select 没办法
from 不行
第4个回答  2019-06-27
你想要实现什么样的效果?
看你写的有点乱.
我先写一个思路你看一下:
第一种,如果你只是想输出bid列的话,可以
select
bid
from

,然后切换下以文本形式显示结果(感觉不是这样的需求...)
第二种,可以按你写的方式去完善一下
第三种,使用游标的形式去print下,总的来讲也和你写的差不太多
第四种,不知道你是不是想要获取所有列上的bid保存到一个字符串
你讲下需求我再写好吗,呵呵,祝你好运~
相似回答