查找所有表列的最小值和最大值

2023-12-07

该查询按预期工作,但速度非常慢。这里有人有提高性能的建议吗?

我本质上只是创建一个临时表来存储所有表和列名称,并通过 WHILE 语句循环它们,以使用我想要的详细信息创建到另一个表的动态插入。

我最近的一次运行花费了大约 21 分钟,这并不完全糟糕(考虑到任务),但我很想获得一些关于如何/在哪里可以对其进行微调的意见。

USE <DATABASE>;

      IF NOT EXISTS(SELECT *
FROM sys.schemas WHERE name='temp')
BEGIN
EXEC ('CREATE SCHEMA temp');
END;

IF OBJECT_ID('temp.columns') IS NOT NULL
   BEGIN
      DROP TABLE temp.columns
   END;

SELECT [table_name]
    , [column_name]
    , [data_type]
    , [is_nullable]
    , [numeric_scale]
    , [ordinal_position]
INTO [temp].[columns]
FROM information_schema.columns c
WHERE table_schema = 'dbo'
      -- AND table_name = 'CONTACTS'
      ;

IF OBJECT_ID('_TableColumnsUsed') IS NOT NULL
   BEGIN
      DROP TABLE _TableColumnsUsed
   END;

      CREATE TABLE _TableColumnsUsed (Table_Name VARCHAR(255) NULL, Column_Position INT, Column_Name VARCHAR(255) NULL, Min_Value VARCHAR(MAX) NULL, Max_Value VARCHAR(MAX) NULL);


DECLARE
     @CurrentTable      VARCHAR(255)
    , @CurrentColumn     VARCHAR(255)
    , @CurrentIsNullable VARCHAR(3)
    , @CurrentNumeric    BIT
    , @CurrentPosition  INT
    , @SQL               VARCHAR(MAX);

WHILE
(
   SELECT COUNT(1)
   FROM temp.columns
) > 0
   BEGIN
      SELECT TOP 1 @CurrentTable = [Table_Name]
               , @CurrentColumn = [Column_Name]
               , @CurrentIsNullable = [is_nullable]
               , @CurrentNumeric = IIF([numeric_scale] IS NULL, 0, 1)
               , @CurrentPosition = [ordinal_position]
      FROM temp.columns c
      WHERE [table_name] NOT IN ('_TableColumnsUsed')
      ORDER BY [table_name]
            , [ordinal_position];

      SET @SQL = 'INSERT INTO _TableColumnsUsed (Table_Name, Column_Position, Column_Name, Min_Value, Max_Value)
         SELECT Table_Name = '''+@CurrentTable+'''
         , Column_Position = '+CAST(@CurrentPosition AS VARCHAR(3))+'
         , Column_Name = '''+@CurrentColumn+'''
         , Min_Value = MIN(CAST('+@CurrentColumn+' AS VARCHAR(MAX)))
         , Max_Value = MAX(CAST('+@CurrentColumn+' AS VARCHAR(MAX)))
         FROM '+@CurrentTable+'
         WHERE '+IIF(@CurrentIsNullable = 'NO', '1=1',
                                        CASE
                                            WHEN @CurrentNumeric = 0
                                            THEN 'ISNULL(CAST('+@CurrentColumn+' AS VARCHAR(MAX)),'''') <> '''''
                                            WHEN @CurrentNumeric = 1
                                            THEN 'ISNULL('+@CurrentColumn+',0.00) <> 0.00'
                                            ELSE '1=1'
                                        END);

      EXEC (@SQL);
      DELETE c
      FROM [temp].[columns] [c]
      WHERE [c].[table_name] = @CurrentTable
           AND [c].[column_name] = @CurrentColumn;
   END;


      /*  -- Dynamic SQL Output Example

         SELECT Table_Name = 'CONTACTS'
         , Column_Position = 17
         , Column_Name = 'ZIP'
         , Min_Value = MIN(CAST(ZIP AS VARCHAR(MAX)))
         , Max_Value = MAX(CAST(ZIP AS VARCHAR(MAX)))
         FROM CONTACTS
         WHERE 1=1

      */


SELECT Table_Name, Column_Position, Column_Name, Min_Value, Max_Value
FROM _TableColumnsUsed;

试试这个,它应该在几秒钟内起作用:

DECLARE @cmd NVARCHAR(MAX)=
(
    SELECT STUFF(
    (
            SELECT ' UNION ALL SELECT ''' + c.TABLE_SCHEMA + ''' AS TableSchema '
                 + ',''' + c.TABLE_NAME + ''' AS TableName '
                 + ',''' + c.COLUMN_NAME + ''' AS ColumnName '
                 + ',''' + c.DATA_TYPE + ''' AS ColumnType '
                 + ',CAST(MIN(' + QUOTENAME(c.COLUMN_NAME)+') AS NVARCHAR(MAX)) AS MinValue ' 
                 + ',CAST(MAX(' + QUOTENAME(c.COLUMN_NAME)+') AS NVARCHAR(MAX)) AS MaxValue ' 
                 + ' FROM ' + QUOTENAME(c.TABLE_SCHEMA) + '.' + QUOTENAME(c.TABLE_NAME)
                 + ' WHERE ' + QUOTENAME(c.COLUMN_NAME) + ' IS NOT NULL'
            FROM INFORMATION_SCHEMA.COLUMNS AS c
            WHERE c.DATA_TYPE IN('bigint','float','int','datetime') --add all types you want to check, be aware of implicit conversions!
            FOR XML PATH(''),TYPE
    ).value('.','nvarchar(max)'),1,10,'')
);
--PRINT @cmd
EXEC(@cmd);

该语句创建了一个一体 UNION ALL通过执行的查询EXEC

您可以取消注释PRINT查看执行的语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找所有表列的最小值和最大值 的相关文章

随机推荐

  • MySQL 事务回滚

    我定义了一个这样的函数 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK SET error key 1
  • Javascript 只允许数字粘贴

    JavaScript jQuery document ready function txt bind paste function e var this this this val this val replace d g Html
  • 在购物车和结帐页面上显示 Woocommerce 产品类别

    我正在尝试让产品类别显示在添加的每个产品的购物车和结账页面上 我的 php 知识非常有限 所以最简单的解释会很棒 我查看了 woocommerce 文档并在 google 上搜索了 genesis connect 文档 但没有找到我要找的内
  • Java String.replace 不起作用

    这是我的代码 String x 1 radic 10 x x replace x System out println x 这应该返回 x 但它正在返回 1 radic 10 为什么这不起作用 String replace不支持正则表达式
  • 是否可以将身份验证从 Webbrowser 转移到 WebRequest

    我正在使用网络浏览器控件登录任何网站 然后我想使用 WebRequest 或 WebClient 下载一些子页面 html 此链接必须需要身份验证 如何将Webbrowser认证信息传递给Webrequest或Webclient 如果问题只
  • UI 测试失败并出现错误“无法在 15.0 秒内获取快照”

    我有一个包含大量单元格的表格视图 我尝试从此表格视图中点击特定单元格 但测试以这个错误结束 15 0s内抓拍失败 我假设系统将在访问其元素之前拍摄整个表视图的快照 由于cell数量巨大 快照时间不够 15秒可能是系统默认时间 我手动设置睡眠
  • iPhone SDK - 在 Web 视图中打开 UITextView 中的链接

    我在 UITextView 上指定了 dataDetectorTypes 以便在触摸时在 Safari 中打开 URL 是否可以拦截此行为 以便我将 URL 加载到 UIWebView 中 或者我会编写自己的 URL 检测器代码来重新路由它
  • 故障排除:不包含适合入口点的静态“main”方法

    我正在尝试创建一个多类程序 该程序创建学生对象 然后允许您更改其中一个学生对象的未声明专业的值 这是我的代码 StudentApp cs using System using System Collections Generic using
  • XSLT:用 \' 替换单引号

    我正在使用 XSLT 将 XML 转换为 html php 文件 在此 XSLT 中 我用 php 代码替换了一些标签 现在我必须将属性值传递到该 php 代码中 我现在的问题是我必须用反斜杠转义单引号才能使其工作 这可以通过 XSLT 实
  • Shapeless:使用 Coproduct 拥有自己的 HList 约束

    注 从Shapeless 尝试通过类型限制 HList 元素 问题 2 使用余积的自身约束 我真正想做的是使用余积编写一个新的约束 trait CPConstraint L lt HList CP lt Coproduct extends
  • Visual Studio javascript 调试不起作用

    这个博客 从 Visual Studio 在 Microsoft Edge 中调试 JavaScripthttps devblogs microsoft com visualstudio debug javascript in micros
  • CSS:css末尾的问号有什么作用?

    维基百科 css 的示例 content a href https link https background url images external link ltr icon png 2 no repeat scroll right c
  • 如何删除 div 上的边框部分以使左侧导航看起来与主要内容部分无缝衔接?

    我试图删除活动菜单项与右侧内容 div 相遇的左边框 See http d pr i hfRZ 所以看起来活动元素与主要内容 div 的级别相同 如下所示http dribbble com shots 663779 Left navigat
  • swift CGPDF文档解析

    我正在尝试使用 Swift 来解析 PDF 文档的内容 遵循 Apple 的编程指南 其中所有示例都是 ObjC let filepath Users ben Desktop Test pdf let localUrl filepath a
  • 在 Windows 上从命令行下载最新的 Java SE 运行时环境 8

    在 Windows 服务器上 我正在寻找一种可靠的方法来从命令行下载最新的 Java SE 运行时 我的要求是检查系统上是否安装了java 如果没有找到java 我们的MSI安装程序 使用WIX创建 需要连接oracle java下载页面并
  • 较小时 UIScrollView 的中心内容

    我有一个UIImageView里面一个UIScrollView我用它来缩放和滚动 如果滚动视图的图像 内容比滚动视图大 则一切正常 但是 当图像变得小于滚动视图时 它会粘在滚动视图的左上角 我想让它保持居中 就像照片应用程序一样 有关保留内
  • 解码十六进制:这一行的作用是什么 (len & 0x01) != 0

    我正在查看 Apache commons 库中的一段代码 并且想知道这些条件到底有何作用 public static byte decodeHex final char data throws DecoderException final
  • 在特定网络接口 Linux/Unix 上使用 C++ TCP 客户端套接字

    我有以下代码 默认情况下连接到接口 eth0 1G NIC 但我想使用 eth5 10G NIC 进行连接 class TCPClientSocket protected int socket file descriptor public
  • 刷新 angularjs 中的标题页面

    在 angularjs 中登录后我必须刷新 header html 当调用登录时 整个页面将被刷新并初始化标题 但登录后仅加载内容而不是标题 我可以做什么来刷新标题 索引 html div class container holder di
  • 查找所有表列的最小值和最大值

    该查询按预期工作 但速度非常慢 这里有人有提高性能的建议吗 我本质上只是创建一个临时表来存储所有表和列名称 并通过 WHILE 语句循环它们 以使用我想要的详细信息创建到另一个表的动态插入 我最近的一次运行花费了大约 21 分钟 这并不完全