我想出了一段代码,以显示每列的所有不同值,并计算每列的记录数.我希望代码遍历所有列.
这是我到目前为止所做的...我是SQL的新手所以忍受noobness :)
硬编码:
select [Sales Manager], count(*)
from [BT].[dbo].[test]
group by [Sales Manager]
order by 2 desc
Run Code Online (Sandbox Code Playgroud)
尝试动态SQL:
Declare @sql varchar(max),
@column as varchar(255)
set @column = '[Sales Manager]'
set @sql = 'select ' + @column + ',count(*) from [BT].[dbo].[test] group by ' + @column + 'order by 2 desc'
exec (@sql)
Run Code Online (Sandbox Code Playgroud)
这两个都很好.如何让它循环遍历所有列?我不介意我是否必须对列名进行硬编码,并且通过在每个列中为@column进行子搜索来实现.
这有意义吗?
谢谢大家!
这是一个XY答案,但如果你不介意硬编码列名,我建议你这样做,并完全避免动态SQL - 和循环.动态SQL通常被认为是最后的手段,如果不小心,会打开安全问题(SQL注入攻击),如果无法缓存查询和执行计划,通常会更慢.
如果你有大量的列名,你可以在Word中编写一段快速的代码或邮件合并来代替你.
但是,就如何获取列名而言,假设这是SQL Server,您可以使用以下查询:
SELECT c.name
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('dbo.test')
Run Code Online (Sandbox Code Playgroud)
因此,您可以从此查询构建动态SQL:
SELECT 'select '
+ QUOTENAME(c.name)
+ ',count(*) from [BT].[dbo].[test] group by '
+ QUOTENAME(c.name)
+ 'order by 2 desc'
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('dbo.test')
Run Code Online (Sandbox Code Playgroud)
并使用游标循环.
或者将整个事物编译成一个批处理并执行.在这里我们使用FOR XML PATH('')技巧:
DECLARE @sql VARCHAR(MAX) = (
SELECT ' select ' --note the extra space at the beginning
+ QUOTENAME(c.name)
+ ',count(*) from [BT].[dbo].[test] group by '
+ QUOTENAME(c.name)
+ 'order by 2 desc'
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('dbo.test')
FOR XML PATH('')
)
EXEC(@sql)
Run Code Online (Sandbox Code Playgroud)
注意我使用内置QUOTENAME函数来转义需要转义的列名.
您可以使用动态SQL并获取表的所有列名称.然后构建脚本:
Declare @sql varchar(max) = ''
declare @tablename as varchar(255) = 'test'
select @sql = @sql + 'select [' + c.name + '],count(*) as ''' + c.name + ''' from [' + t.name + '] group by [' + c.name + '] order by 2 desc; '
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = @tablename
EXEC (@sql)
Run Code Online (Sandbox Code Playgroud)
更改@tablename为表的名称(不包含数据库或模式名称).
| 归档时间: |
|
| 查看次数: |
53599 次 |
| 最近记录: |