我的查询列出了我的数据库中的所有表及其各自的索引:
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
我得到这样的输出:
TableName -> 包含数据库中的表名
ColumName -> 包含数据库中每个表的索引列名称
我的目标是绘制每个 "TableName"+ "ColumnName"
TOT 记录数和最后一个(最大)ColumnName 值。
您知道如何在单个查询中递归生成此结果吗? 谢谢!
最佳答案
嗯,这可能足够快,可以在您的设置中运行,这是我最好的尝试。存在涉及列类型和 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/