获取表中的所有列以及示例结果集

问题描述 投票:0回答:2

我正在分析数据库。我这样做的方法是获取表列和行的示例。结果会是这样的:

字段名称 价值
身份证 0
姓名 鲍勃

我当前的查询是这样的:

SELECT FieldName, Value
FROM 
   (SELECT TOP 1
       isnull(CAST([Id] AS varchar(MAX)),'no-data') as Id
      ,isnull(CAST([Name] AS varchar(MAX)),'no-data') as Name
    FROM person
    ORDER BY id desc) p
UNPIVOT
   (Value FOR FieldName IN
      ([Id]
      ,[Name])
   ) AS unpvt;

我的问题是,对于每个表,我都必须重建查询。有没有其他方法可以跨表重复执行此操作?

sql sql-server
2个回答
1
投票

这里有一个快速入门的想法:

DECLARE @sql nvarchar(max)

SELECT  @sql = STRING_AGG('select [key] as ' + quotename(name) + N', Value as value from openjson((select top 1 * from ' + quotename(name) + ' x for json path), ''$[0]'')
', '')
FROM    sys.tables t

EXEC    (@sql)

它会生成一长串动态 sql,而该字符串又会反转每个表的一行并显示它。

这是一个输出示例:

spt_监视器 价值
最后跑步 2022-10-08T06:31:55.527
cpu_忙 23
io_busy 141
空闲 3892
包装已收到 39
打包已发送 39
连接 69
pack_errors 0
总读数 0
总写入量 0
总错误数 0
MSreplication_options 价值
选择名称 交易性
价值 真实
主要版本 90
次要版本 0
修订 0
安装失败 0

0
投票

请尝试以下基于Json的解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, FName VARCHAR(20), LName VARCHAR(20), Place VARCHAR(20));
INSERT @tbl (FName, LName, Place) VALUES
('Jane', 'Paulin' , NULL),
('Marin', 'Marconi' , 'Spain'),
('Bill', 'Doherty', 'UK');
-- DDL and sample data population, end

WITH rs AS
(
    SELECT TOP(1) * FROM @tbl ORDER BY 1
)
SELECT seq = ROW_NUMBER() OVER (ORDER BY @@SPID)
      , ColumnName  = B.[Key]
      , Value = B.[Value]
FROM rs AS A
CROSS APPLY (SELECT * 
            FROM  OPENJSON((SELECT A.* FOR JSON PATH,WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES)) 
            WHERE [Key] NOT IN ('id','Other','Columns','ToExclude') -- exception list
             ) AS B;

输出

序列 列名称 价值
1 F名称
2 L名称 保林
3 地点
© www.soinside.com 2019 - 2024. All rights reserved.