我正在尝试创建一个接受(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
。
我如何:
根据表名和列名返回MIN
等统计信息,或
在MIN
(以及其他统计信息)的所有列上循环播放?
答案 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开始有 处理权限的方法。然而,这 是一个坏主意。