嵌套查询嵌套查询

时间:2015-09-18 18:39:03

标签: sql-server

此查询

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

有什么想法吗?

2 个答案:

答案 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);