【问题标题】:Get first row in table while printing out Table name and Column name在打印出表名和列名时获取表中的第一行
【发布时间】:2018-06-29 18:07:57
【问题描述】:

我需要快速查看 MS SQL 数据集中的数据,并找到以下代码,除了我需要的最后一列之外,它提供了所有内容。第三列应显示第一行的数据。

SELECT TABLE_NAME, COLUMN_NAME  FROM INFORMATION_SCHEMA.COLUMNS

所以我的问题是我应该如何制定 SQL 查询以获取包含第一行数据的第三列)?

//更新 除了数据来自哪个表之外,这段代码给了我我想要的一切。 (雅罗斯拉夫在Select the first 3 rows of each table in a database 回答的类似问题)

DECLARE @sql VARCHAR(MAX)=''; 
SELECT @sql=@sql+'SELECT TOP 3 * FROM '+'['+SCHEMA_NAME(schema_id)+'].['+name+']'+';'
FROM sys.tables
EXEC(@sql)

【问题讨论】:

  • 如果为不同的表选择元数据,如何才能拥有相同数量的列?
  • 您是要查找列的数据类型还是表中的实际值?
  • @TimBiegeleisen 我不确定我是否理解你的问题?也许我的列公式不清楚?在图片中,我认为它显示 2 列。在 COLUMN_NAME 的右侧,我希望它说一些通用的内容,然后对于每一行,它应该显示该列中的数据。这样做的目的是让我找出每个表中有哪些类型的数据,而无需手动通过每个表 ni SSMS。
  • @Markov 这是我追求的实际价值。我在对 Tim 的评论中详细阐述了一些内容。
  • @MagnusKarlsson 我现在明白了。我认为您需要使用动态 SQL 来执行此操作。您可以对第三列使用标量子查询,在要检索的列和表名中使用管道。

标签: sql-server tsql


【解决方案1】:

如果我理解正确的话,一种方法是使用未记录的存储过程sp_MsForeachTable。问号是表格名称的占位符:

提示:编辑“YourDataBase”...

EXEC sp_msforeachtable 'USE YourDataBase;SELECT TOP 1 ''?'' AS TableName, * FROM ?';

使用此查询,您可以轻松浏览所有第一行

CREATE TABLE #test(TableName NVARCHAR(MAX),Content XML)

EXEC sp_msforeachtable 
'USE YourDataBase;INSERT INTO #test SELECT ''?'' AS TableName, (SELECT TOP 1 * FROM ? FOR XML PATH(''row''))';

SELECT * FROM #test;

更新

您自己的代码也会返回表的名称。试试这个

DECLARE @sql VARCHAR(MAX)=''; 
SELECT @sql=@sql+'SELECT TOP 3 ''' + t.[name] + ''' AS TableName, * FROM '+'['+SCHEMA_NAME(schema_id)+'].['+name+']'+';'
FROM sys.tables t
EXEC(@sql)

【讨论】:

  • 谢谢!像魅力一样工作:)
【解决方案2】:

我知道这并不多,但它会为您构建一个 select 语句,然后您可以遍历每个语句 exec 每个语句或编写一个联合,但我想这可能是一个很好的起点

编辑:您还可以编写一个循环并执行循环中的每个语句,将值插入最终表,然后从该表中选择,您应该会很好。

SELECT
    t.String
   ,t.q
   ,t.TABLE_NAME
   ,t.q2
   ,t.tbname
   ,t.com2
   ,t.q4
   ,t.COLUMN_NAME
   ,t.q5
   ,t.Columnname
   ,t.com3
   ,t.ColName
   ,t.[From]
   ,t.FromSelect
FROM (SELECT
        'Select top 1 ' AS String
       ,'''' q
       ,TABLE_NAME
       ,'''' q2
       ,'as TableName'
        as tbname
       ,',' com2

       ,'''' q4
       ,COLUMN_NAME
       ,'''' q5
       ,'as COLUMN_NAME'
       as Columnname
       ,',' com3
       ,COLUMN_NAME as ColName
       , 'Value From ' as [From]
       ,TABLE_NAME as FromSelect
       ,ROW_NUMBER() OVER (PARTITION BY TABLE_NAME ORDER BY TABLE_NAME DESC, COLUMN_NAME) rn
    FROM INFORMATION_SCHEMA.COLUMNS c
    ) t
WHERE rn = 1;

每个表的结果都是这样的。

Select top 1    '   zipcodes    '   as TableName    ,   '   CITY    '   as COLUMN_NAME  ,   CITY    Value From  zipcodes
Select top 1    '   _BHCAMERAPRICE  '   as TableName    ,   '   _BHID   '   as COLUMN_NAME  ,   _BHID   Value From  _BHCAMERAPRICE

【讨论】:

  • 看起来棒极了,我明天在办公室试试这个。回复你!
  • 我喜欢所提供的结构,但是(在这里我从不编写 SQL 代码)我不知道如何从表中获取值?用代码更新了我的问题,为我提供了除表名之外的所有内容。
猜你喜欢
  • 2013-02-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2022-08-03
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多