SQL递归索引查找查询

标签 sql sql-server indexing

我的查询列出了我的数据库中的所有表及其各自的索引:

SELECT 
     TableName = t.name,
     IndexName = ind.name,
     IndexId = ind.index_id,
     ColumnId = ic.index_column_id,
     ColumnName = col.name,
     ind.*,
     ic.*,
     col.* 
FROM 
     sys.indexes ind 
INNER JOIN 
     sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id 
INNER JOIN 
     sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
INNER JOIN 
     sys.tables t ON ind.object_id = t.object_id 
WHERE 
     ind.is_primary_key = 0 
     AND ind.is_unique = 0 
     AND ind.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0

我得到这样的输出:

enter image description here

TableName -> 包含数据库中的表名 ColumName -> 包含数据库中每个表的索引列名称

我的目标是绘制每个 "TableName"+ "ColumnName" TOT 记录数和最后一个(最大)ColumnName 值。

基本上这是我想要获得的制表符格式的输出: enter image description here

您知道如何在单个查询中递归生成此结果吗? 谢谢!

最佳答案

嗯,这可能足够快,可以在您的设置中运行,这是我最好的尝试。存在涉及列类型和 max() 聚合的问题,这表明 max_value 应该是 varchar

只需确保在创建和执行此过程之前使用 your_database_name,这对于应用程序调用类似于单个查询。

create proc stp_generateColInfo as

declare
 @tablename varchar(1000),
 @columnname varchar(1000)

set nocount on

create table #TMP_DDL (
    TableName varchar(1000), 
    ColumnName varchar(1000),
    TOTAL int,
    MAX_VALUE varchar(8000)
);

INSERT INTO #TMP_DDL
SELECT 
     TableName = t.name,
     ColumnName = col.name,
     0 as TOTAL,
     '' as MAX_VALUE
FROM 
     sys.indexes ind 
INNER JOIN 
     sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id 
INNER JOIN 
     sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
INNER JOIN 
     sys.tables t ON ind.object_id = t.object_id 
WHERE 
     ind.is_primary_key = 0 
     AND ind.is_unique = 0 
     AND ind.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0


declare cs cursor local static forward_only for
    select TableName, ColumnName from #TMP_DDL

open cs
fetch next from cs into @tablename, @columnname
while @@FETCH_STATUS=0
begin
    exec('
    declare @total int, @max_value varchar(8000)
    select @total=count(*), @max_value=max(IsNull(' + @columnname + ',0)) from ' + @tablename + '
    update #TMP_DDL set total=@total, max_value=@max_value where TableName=''' + @tablename + ''' and ColumnName=''' + @columnname + ''''
    )
    fetch next from cs into @tablename, @columnname
end

close cs
deallocate cs

set nocount off

--Add joins here to select additional columns :)
select * from #TMP_DDL

go

关于SQL递归索引查找查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45866436/

相关文章:

mysql - 多聚合sql查询函数

sql-server - Perl ADO 认为存储过程中的打印输出是错误!

php - 为下面的查询创建索引的最佳方法是什么

Mysql表记录显示歪了

sql - 将 varchar 值转换为 int 时转换失败

mysql - 如何在一个数据类型中至少包含 1 个内容?

sql-server - SQL Server 数据库备份文件的 MIME 类型

sql - 为什么 SQL Server 使用 ROUND 会引发算术溢出错误?

sql - 如何在可能具有空值的字段上创建唯一索引 (Oracle 11g)?

r - 使用 data.table 为行 block 创建组标签