Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL递归索引查找查询_Sql_Sql Server_Indexing - Fatal编程技术网

SQL递归索引查找查询

SQL递归索引查找查询,sql,sql-server,indexing,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

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

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”
总记录数和最后一个(最大)ColumnName值绘图

基本上,这就是我希望获得的制表符格式的输出:

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

嗯,这可能足够快,可以在您的设置中运行,这是我最好的尝试。有一些问题涉及到列的类型和
max()
aggregate,这意味着
max\u值应该是
varchar

在创建和执行此过程之前,请确保
使用您的\u数据库\u名称
,对于应用程序调用,此过程类似于单个查询

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语句

SET @sql = 'SELECT @MaxID = MAX('+@ColumnName+') FROM '+@TableName
分别用于结果集的每一行,因为在SQL Server中无法将其作为一个select语句编写。不能在一个查询中分别为每一行调用动态SQL或SQL


在Oracle中,有类似的命令允许将结果集与逐行处理相结合,但我不知道SQL Server中存在类似的命令。

“为每个“TableName”+“ColumnName”绘制记录总数和最后一个(最大)ColumnName值。”:我不知道这意味着什么。你能在你的问题中包括一个你想要输出的表格吗?刚刚添加。基本上,在主查询中,我需要对每个表名和每个列名进行迭代,并获取记录总数和最后一个值。@user3925023-每个表都有主键?有没有办法避免创建表?我没有这样做的权限。Thxsee:我想每个用户都有权创建临时表!