我正在分析数据库。我这样做的方法是获取表列和行的示例。结果会是这样的:
字段名称 | 价值 |
---|---|
身份证 | 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;
我的问题是,对于每个表,我都必须重建查询。有没有其他方法可以跨表重复执行此操作?
这里有一个快速入门的想法:
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 |
请尝试以下基于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 | 地点 | 空 |