2016-09-21 65 views
0

有没有办法做到这一点与t-sql不使用游标或循环或临时表?也许通过使用动态SQL?从数据库的所有表中的某些列中查找值 - 动态sql?

我想从数据库中每个表的第一列中获取最大值。

我使用syscolumns向我显示所有表的名称和每个表中第一列的名称。

因此,在下面的(非工作)示例中,我需要找到一种方法来循环访问syscolumns,并使用@tabname和@colname的所有值。有没有办法做到这一点?

declare @tabname sysname; 
declare @colname sysname; 

SELECT 
name         as [column name], 
object_NAME(id)       as [table name], 
(select max(@colname) from @tabname) as [max col value] 
from syscolumns    
where colorder = 1 

任何帮助或提示表示赞赏。

问候,戴夫。

+0

什么奇怪的要求。这可以提供什么样的实际使用?要从每个表的第一列中获取最大值将需要动态sql。下面Kannan提供的答案在获取列名方面做得很好。你需要用动态sql来扩展它以获取你的值。 –

+0

谢谢肖恩。是的,其他人的要求在这样的论坛中脱离上下文时总是非常奇怪。不幸的是,由于安全原因,我无法详细说明上下文。通过使用我的非常简单的syscolumns起始查询(其中colorder = 1)(我在给Kannan的答复中查看它),我得到了所有列名称和表名。 – davehants

回答

0

您可以使用这样的查询

;WITH cte 
AS (SELECT 
    object_id, 
    MIN(column_id) mincolumnid 
FROM sys.columns 
GROUP BY object_id) 
SELECT 
    t.name, 
    c.name 
FROM sys.tables t 
INNER JOIN sys.columns c 
    ON t.object_id = c.object_id 
INNER JOIN cte ct 
    ON c.object_id = ct.object_id 
    AND c.column_id = ct.mincolumnid 
+0

这获取列名称,但不是OP的状态值。 –

+0

哦,明白了。我误解了这个问题,并认为我只需要获得列名,正如你所提到的那样,我们可能需要通过循环遍历所有表来获得值 –

+0

是的。你的查询是动态SQL的一个很好的起点。 –

相关问题