如何根据表和列名计算数据库列统计信息?

时间:2014-03-05 17:24:55

标签: sql tsql

我正在尝试创建一个接受(SQL Server)数据库表的存储过程,并返回每列的摘要。

我想要的大部分内容都来自INFORMATION_SCHEMA.COLUMNS,但对于数字列,我想要包含一些基本的统计信息,例如mean / min / max。

我的计划是提出这样的查询:

SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE AS DataType,
    CASE 
      WHEN DATA_TYPE IN (
        'bigint', 'bit', 'date', 'datetime', 'datetime2',
        'datetimeoffset', 'decimal', 'float', 'int', 'money', 
        'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 
        'time', 'timestamp', 'tinyint')
        THEN dbo.GetMin(TABLE_NAME, COLUMN_NAME)
      ELSE NULL
    END AS MinSql
  FROM INFORMATION_SCHEMA.COLUMNS 

用户定义的函数GetMin,其正文如下所示:

DECLARE @Sql varchar(MAX) = CONCAT(
  'SELECT MIN(', 
  @ColumnName, 
  ') FROM ', 
  @TableName
  ''';'
);

EXEC(@Sql);

不幸的是,在UDF中不允许调用EXEC

我如何:

  1. 根据表名和列名返回MIN等统计信息,或

  2. MIN(以及其他统计信息)的所有列上循环播放?

1 个答案:

答案 0 :(得分:1)

引用“常见情况何时(不)使用动态SQL”标题  article from my comment

  

一个常见的问题是为什么以下方法不起作用:

CREATE PROCEDURE my_proc @tablename sysname AS
   SELECT * FROM @tablename
  

正如我们所看到的,我们可以在动态的帮助下使这个程序工作   SQL,但也应该清楚我们没有获得任何优势   在存储过程中生成动态SQL。你可以   以及从客户端发送动态SQL。那么,好的:1)如果SQL   声明非常复杂,你可以节省一些网络流量   封装。 2)正如我们所看到的,从SQL 2005开始有   处理权限的方法。然而,这 是一个坏主意。