此查询
SELECT name
FROM sysobjects
WHERE id IN (SELECT id FROM syscolumns WHERE name LIKE 'TICKER')
生成包含名为TICKER的列的表列表。
现在我想查看每个表中的所有数据。
Select *
from (the result from the above query)
实施例
Select * from POS
Select * from SEC
Select * from BROKER
有什么想法吗?
答案 0 :(得分:1)
设置基于\无游标。
最终编辑 - 两种解决方案的组合
Declare @Sql NVarchar(Max) = N'';
Select @Sql += N'Select * From ' + QuoteName(Schema_Name(Schema_id)), '[') + N'.' + QuoteName(Tables.Name, '[') + N';'
From sys.tables
Join sys.Columns
On tables.object_id = Columns.object_id
Where columns.Name = 'Ticker';
Exec (@Sql);
答案 1 :(得分:0)
您应该在两个表上使用INNER JOIN,并且还应该使用sys.objects和sys.columns系统视图而不是不推荐使用的sysobjects和syscolumns。另外,如果你没有外卡,你应该使用equals而不是'like'。
结果是这样的:
SELECT *
FROM sys.objects o
INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE c.name = 'TICKER'
好的,你在我回答时改变了我的问题...所以你的新要求(这是非常危险的......想想如果它返回一千个具有给定列名的表会发生什么) ,您可以像这样使用动态SQL:
DECLARE @sql varchar(MAX);
DECLARE @tableName sysname;
DECLARE theCursor CURSOR FAST_FORWARD FOR
SELECT o.name AS TableName
FROM sys.objects o
INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE c.name = 'TICKER';
OPEN theCursor;
FETCH NEXT FROM theCursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'SELECT * FROM ' + QUOTENAME(@tableName);
EXEC (@sql);
FETCH NEXT FROM theCursor INTO @tableName;
END
CLOSE theCursor;
DEALLOCATE theCursor;
或者,如果你想避开光标,就这样做,不需要临时表:
DECLARE @sql varchar(MAX);
SET @sql = '';
SELECT @sql += 'SELECT * FROM ' + QUOTENAME(o.name) + '; '
FROM sys.objects o
INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE c.name = 'TICKER';
EXEC (@sql);