使用场景:知道表名,同时知道这个表中含有某个字符串,但是不知道这个字符串是在表的哪些列,在列比较多的情况下,查询很麻烦,通过以下语句或者封装的存储可以查出字符串在哪些列出现。结果集里 ContainsValue = 1 就是包含字符串的列。

-- 配置参数
DECLARE @TableName NVARCHAR(128) = 'YourTableName';  -- 替换为实际表名
DECLARE @SearchValue SQL_VARIANT = 'YourSearchValue';  -- 替换为要查找的值
DECLARE @SQL NVARCHAR(MAX) = '';
DECLARE @ColumnName NVARCHAR(128);
DECLARE @ColumnType NVARCHAR(128);
DECLARE @SearchValueStr NVARCHAR(MAX);
DECLARE @IsNumeric BIT;
DECLARE @IsDate BIT;

-- 创建临时表存储结果
IF OBJECT_ID('tempdb..#ColumnSearchResults') IS NOT NULL
    DROP TABLE #ColumnSearchResults;
    
CREATE TABLE #ColumnSearchResults (
    ColumnName NVARCHAR(128),
    ContainsValue BIT
);

-- 将SQL_VARIANT转换为字符串
SET @SearchValueStr = CONVERT(NVARCHAR(MAX), @SearchValue);

-- 预检查是否为数值或日期
SET @IsNumeric = ISNUMERIC(@SearchValueStr);
SET @IsDate = ISDATE(@SearchValueStr);

-- 获取表的所有列名(兼容旧版SQL Server)
DECLARE ColumnCursor CURSOR FOR
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
  AND DATA_TYPE NOT IN ('image', 'text', 'ntext', 'hierarchyid', 'geometry', 'geography', 'xml', 'timestamp');

OPEN ColumnCursor;
FETCH NEXT FROM ColumnCursor INTO @ColumnName, @ColumnType;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 处理数值类型(优化算术溢出问题)
    IF @ColumnType IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney')
    BEGIN
        IF @IsNumeric = 1
        BEGIN
            -- 使用字符串比较避免直接转换搜索值
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 
                   CASE 
                       WHEN EXISTS (
                           SELECT 1 
                           FROM ' + QUOTENAME(@TableName) + ' 
                           WHERE LTRIM(RTRIM(CONVERT(NVARCHAR(MAX), ' + QUOTENAME(@ColumnName) + '))) = @SearchValue)
                       THEN 1 
                       ELSE 0 
                   END';
        END
        ELSE
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 0';
    END
    -- 处理日期/时间类型的特殊转换
    ELSE IF @ColumnType IN ('date', 'datetime', 'datetime2', 'smalldatetime')
    BEGIN
        IF @IsDate = 1
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 
                   CASE 
                       WHEN EXISTS (
                           SELECT 1 
                           FROM ' + QUOTENAME(@TableName) + ' 
                           WHERE CONVERT(NVARCHAR(30), ' + QUOTENAME(@ColumnName) + ', 120) = @SearchValue)
                       THEN 1 
                       ELSE 0 
                   END';
        ELSE
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 0';
    END
    -- 处理时间类型
    ELSE IF @ColumnType = 'time'
    BEGIN
        -- 检查时间格式是否有效
        IF @IsDate = 1 OR ISDATE('2000-01-01 ' + @SearchValueStr) = 1
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 
                   CASE 
                       WHEN EXISTS (
                           SELECT 1 
                           FROM ' + QUOTENAME(@TableName) + ' 
                           WHERE CONVERT(NVARCHAR(12), ' + QUOTENAME(@ColumnName) + ', 114) = @SearchValue)
                       THEN 1 
                       ELSE 0 
                   END';
        ELSE
            SET @SQL = '
            INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
            SELECT ''' + QUOTENAME(@ColumnName) + ''', 0';
    END
    -- 处理位类型
    ELSE IF @ColumnType = 'bit'
        SET @SQL = '
        INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
        SELECT ''' + QUOTENAME(@ColumnName) + ''', 
               CASE 
                   WHEN EXISTS (
                       SELECT 1 
                       FROM ' + QUOTENAME(@TableName) + ' 
                       WHERE ' + QUOTENAME(@ColumnName) + ' = CASE 
                           WHEN @SearchValue IN (''1'', ''true'', ''TRUE'') THEN 1 
                           WHEN @SearchValue IN (''0'', ''false'', ''FALSE'') THEN 0 
                           ELSE NULL 
                       END)
                   THEN 1 
                   ELSE 0 
               END';
    -- 处理其他类型(默认作为字符串比较)
    ELSE
        SET @SQL = '
        INSERT INTO #ColumnSearchResults (ColumnName, ContainsValue)
        SELECT ''' + QUOTENAME(@ColumnName) + ''', 
               CASE 
                   WHEN EXISTS (
                       SELECT 1 
                       FROM ' + QUOTENAME(@TableName) + ' 
                       WHERE ' + QUOTENAME(@ColumnName) + ' = @SearchValue)
                   THEN 1 
                   ELSE 0 
               END';
    
    -- 执行查询
    EXEC sp_executesql 
        @SQL, 
        N'@SearchValue NVARCHAR(MAX)', 
        @SearchValue = @SearchValueStr;
    
    FETCH NEXT FROM ColumnCursor INTO @ColumnName, @ColumnType;
END;

CLOSE ColumnCursor;
DEALLOCATE ColumnCursor;

-- 返回结果
SELECT * FROM #ColumnSearchResults


-- 封装为存储过程

CREATE PROCEDURE UP_SearchAllColumns
    @TableName NVARCHAR(128),
    @SearchValue SQL_VARIANT,
    @ResultTable NVARCHAR(128) = NULL  -- 可选参数:指定结果表名
AS
BEGIN
    SET NOCOUNT ON;

    -- 声明变量
    DECLARE @SQL NVARCHAR(MAX) = '';
    DECLARE @ColumnName NVARCHAR(128);
    DECLARE @ColumnType NVARCHAR(128);
    DECLARE @SearchValueStr NVARCHAR(MAX);
    DECLARE @IsNumeric BIT;
    DECLARE @IsDate BIT;
    DECLARE @ResultTableName NVARCHAR(128);

    -- 设置结果表名
    IF @ResultTable IS NULL
        SET @ResultTableName = '##SearchResults_' + REPLACE(CAST(NEWID() AS NVARCHAR(36)), '-', '_');
    ELSE
        SET @ResultTableName = @ResultTable;

    -- 创建结果表
    SET @SQL = '
    IF OBJECT_ID(''tempdb..' + QUOTENAME(@ResultTableName) + ''') IS NOT NULL
        DROP TABLE ' + QUOTENAME(@ResultTableName) + ';
        
    CREATE TABLE ' + QUOTENAME(@ResultTableName) + ' (
        ColumnName NVARCHAR(128),
        ContainsValue BIT
    );';
    
    EXEC sp_executesql @SQL;

    -- 将SQL_VARIANT转换为字符串
    SET @SearchValueStr = CONVERT(NVARCHAR(MAX), @SearchValue);

    -- 预检查是否为数值或日期
    SET @IsNumeric = ISNUMERIC(@SearchValueStr);
    SET @IsDate = ISDATE(@SearchValueStr);

    -- 检查目标表是否存在
    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName)
    BEGIN
        RAISERROR('目标表不存在: %s', 16, 1, @TableName);
        RETURN;
    END;

    -- 获取表的所有列名(兼容旧版SQL Server)
    DECLARE ColumnCursor CURSOR FOR
    SELECT COLUMN_NAME, DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @TableName
      AND DATA_TYPE NOT IN ('image', 'text', 'ntext', 'hierarchyid', 'geometry', 'geography', 'xml', 'timestamp');

    OPEN ColumnCursor;
    FETCH NEXT FROM ColumnCursor INTO @ColumnName, @ColumnType;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 处理数值类型(优化算术溢出问题)
        IF @ColumnType IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney')
        BEGIN
            IF @IsNumeric = 1
            BEGIN
                -- 使用字符串比较避免直接转换搜索值
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 
                       CASE 
                           WHEN EXISTS (
                               SELECT 1 
                               FROM ' + QUOTENAME(@TableName) + ' 
                               WHERE LTRIM(RTRIM(CONVERT(NVARCHAR(MAX), ' + QUOTENAME(@ColumnName) + '))) = @pSearchValue)
                           THEN 1 
                           ELSE 0 
                       END';
            END
            ELSE
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 0';
        END
        -- 处理日期/时间类型的特殊转换
        ELSE IF @ColumnType IN ('date', 'datetime', 'datetime2', 'smalldatetime')
        BEGIN
            IF @IsDate = 1
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 
                       CASE 
                           WHEN EXISTS (
                               SELECT 1 
                               FROM ' + QUOTENAME(@TableName) + ' 
                               WHERE CONVERT(NVARCHAR(30), ' + QUOTENAME(@ColumnName) + ', 120) = @pSearchValue)
                           THEN 1 
                           ELSE 0 
                       END';
            ELSE
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 0';
        END
        -- 处理时间类型
        ELSE IF @ColumnType = 'time'
        BEGIN
            -- 检查时间格式是否有效
            IF @IsDate = 1 OR ISDATE('2000-01-01 ' + @SearchValueStr) = 1
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 
                       CASE 
                           WHEN EXISTS (
                               SELECT 1 
                               FROM ' + QUOTENAME(@TableName) + ' 
                               WHERE CONVERT(NVARCHAR(12), ' + QUOTENAME(@ColumnName) + ', 114) = @pSearchValue)
                           THEN 1 
                           ELSE 0 
                       END';
            ELSE
                SET @SQL = '
                INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
                SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 0';
        END
        -- 处理位类型
        ELSE IF @ColumnType = 'bit'
            SET @SQL = '
            INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
            SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 
                   CASE 
                       WHEN EXISTS (
                           SELECT 1 
                           FROM ' + QUOTENAME(@TableName) + ' 
                           WHERE ' + QUOTENAME(@ColumnName) + ' = CASE 
                               WHEN @pSearchValue IN (''1'', ''true'', ''TRUE'') THEN 1 
                               WHEN @pSearchValue IN (''0'', ''false'', ''FALSE'') THEN 0 
                               ELSE NULL 
                           END)
                       THEN 1 
                       ELSE 0 
                   END';
        -- 处理其他类型(默认作为字符串比较)
        ELSE
            SET @SQL = '
            INSERT INTO ' + QUOTENAME(@ResultTableName) + ' (ColumnName, ContainsValue)
            SELECT ''' + REPLACE(@ColumnName, '''', '''''') + ''', 
                   CASE 
                       WHEN EXISTS (
                           SELECT 1 
                           FROM ' + QUOTENAME(@TableName) + ' 
                           WHERE ' + QUOTENAME(@ColumnName) + ' = @pSearchValue)
                       THEN 1 
                       ELSE 0 
                   END';
        
        -- 执行查询
        BEGIN TRY
            EXEC sp_executesql 
                @SQL, 
                N'@pSearchValue NVARCHAR(MAX)', 
                @pSearchValue = @SearchValueStr;
        END TRY
        BEGIN CATCH
            -- 记录错误但继续处理其他列
            PRINT '处理列 [' + @ColumnName + '] 时出错: ' + ERROR_MESSAGE();
        END CATCH;
        
        FETCH NEXT FROM ColumnCursor INTO @ColumnName, @ColumnType;
    END;

    CLOSE ColumnCursor;
    DEALLOCATE ColumnCursor;

    -- 返回结果
    SET @SQL = 'SELECT * FROM ' + QUOTENAME(@ResultTableName);
    EXEC sp_executesql @SQL;

    -- 如果使用的是临时表,则清理
    IF @ResultTable IS NULL
    BEGIN
        SET @SQL = 'DROP TABLE ' + QUOTENAME(@ResultTableName);
        EXEC sp_executesql @SQL;
    END;
END;    

/*
-- 简单调用(使用临时表)
EXEC up_SearchAllColumns
    @TableName = 'YourTableName', -- 实际表名
    @SearchValue = 'YourSearchValue';  -- 实际要查询的值

-- 指定结果表
EXEC up_SearchAllColumns
    @TableName = 'YourTableName',
    @SearchValue = 'YourSearchValue',
    @ResultTable = 'dbo.SearchResults';

-- 查看结果
SELECT * FROM dbo.SearchResults;
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86576.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86576.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86576.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Outline】纯Docker部署指南

本文介绍了使用Docker部署Outline知识管理系统的完整流程。 主要内容包括: 部署PostgreSQL 12数据库并创建用户;安装Redis 6缓存服务;配置Minio对象存储服务替代AWS S3;搭建SSO单点登录服务器;准备Outline容器镜像和环…

终止分区表变更操作时误删数据字典缓存导致MySQL崩溃分析

终止分区表变更操作时误删数据字典缓存导致MySQL崩溃分析 1. 问题简述 在 MySQL 中,当终止一个处于 committing alter table to storage engine 阶段的分区表操作时,InnoDB 会尝试进行回滚并清理数据字典缓存。不幸的是,过程中发生了误删表…

进程关系与守护进程全解析

进程关系和守护进程 进程组 每一个进程除了有一个进程ID(PID)之外还属于一个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程,每一个进程组也有一个唯一的进程组ID(PGID), 并且这个PGID 类似于进程ID, 同样…

PyAutoGUI 测试框架

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】

Git安装避坑指南

Git高速下载 程序员面试资料大全|各种技术书籍等资料-1000G 一、安装前准备:避免环境冲突 1. 检查系统残留(Windows) # 检查旧版Git残留 where git where git.exe# 检查环境变量 $env:PATH -split ; | Select-String git# 清理…

MATLAB中的并行加速技术与工具

文章目录 MATLAB中的并行加速技术与工具1. 多线程计算(隐式并行)2. Parallel Computing Toolbox (并行计算工具箱)2.1 parfor (并行for循环)2.2 spmd (单程序多数据)2.3 parfeval (异步并行执行) 3. GPU计算4. 分布式计算 (MATLAB Parallel Server)5. 批…

GR00T N1.5 技术报告 -- Nvidia -- 2025.6.11 -- 开源

0. 前言 GR00T N1 的详细介绍 Isaac-GR00T 在6.11 进行了全面升级,从 N1 进化为 N1.5,但基本还是基于之前的架构,官方发布了一个技术报告,并更新了github库,之前的N1也做了独立版本 N1 N 1.5 github 技术报告 model…

SRS WebRTC 入门

什么是 SRS WebRTC? SRS (Simple Realtime Server) 是一个支持 WebRTC 流媒体的开源媒体服务器。它允许你建立基于 WebRTC 的低延迟直播和实时通信应用。 快速开始 1. 安装 SRS bash # 使用 Docker 快速安装 docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080…

从手机随拍到标准扫描件:AI如何智能校正证件照片(Python+OpenCV)

目录 一、概述二、解决方案2.1 核心挑战:AI眼中的“三座大山”2.2 设计思路:给AI一个“智能提示”2.3 实现流程:四步搞定 三、代码实现3.1 依赖库3.2 代码 四、结语 一、概述 在当今的线上业务中,要求用户上传身份证、驾驶证等证…

基于OpenCV图像分割与PyTorch的增强图像分类方案

在图像分类任务中,背景噪声和复杂场景常常会对分类准确率产生负面影响。为了应对这一挑战,本文介绍了一种结合OpenCV图像分割与PyTorch深度学习框架的增强图像分类方案。通过先对图像进行分割提取感兴趣区域(Region of Interest,R…

华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件

华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件 介绍使用前须知vue代码调用示例权限说明API调用说明初始化配置(openClient)创建桶(createBucket)列举桶(listBuckets)删除桶(deleteBucket&#xf…

Buildroot 2025.05 中文手册【AI高质量翻译】

译文在 Github 仓库 和 Gitee 仓库 保持最新,其它平台发的文档可能不会与之同步。 希望能够共同维护这个 仓库的 Buildroot 手册 中文译文,帮助更多人真正深入学习理解,更好的工作、生活和创造。 关于 AI 提示词 以及 更多工具 的收集&#…

采用ArcGIS10.8.2 进行插值图绘制

一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…

Python网安-zip文件暴力破解(仅供学习)

目录 源码在这里 需要的模块 准备一个密码本和需要破解的ZIP文件 一行一行地从密码文件中读取每个密码。 核心部分 注意,需要修改上段代码注释里的这段具有编码问题的代码: 源码在这里 https://github.com/Wist-fully/Attack/tree/cracker 需要的…

如何让ChatGPT模仿人类写作,降低AIGC率?

在AI技术日益普及的当下,ChatGPT 等大语言模型已成为许多学术与写作任务中的得力助手。然而,学境思源,随着各类“AI检测系统”的出现,一键生成论文初稿!我们也遇到一个新的问题:如何让AI写作看起来不像AI写…

科大讯飞2025AI开发者大赛-用户新增赛道时间规则解析

根据训练集中的时间规则,对测试集中的数据推断用户标签(新用户或老用户)。 时间规则如下: 针对训练集和测试集中都存在的did: 找到在训练集中标记为新用户最晚的时间点,则测试集中对应did的数据在此时间点前全部为新用…

.NET C# async/定时任务的异步线程池调度方案最大线程数‌ = 处理器核心数 × 250

关于.NET中Threading.Timer的线程机制,结合线程池特性和异步协作原理分析如下: 一、线程复用机制 ‌共享进程级线程池‌ Threading.Timer的回调任务‌不会每次新建线程‌,而是提交到.NET进程全局线程池统一调度,该线程池与async/…

Redis 高可用分片集群:主从模式与哨兵机制详解

一、为何需要分片集群? 在讨论具体方案之前,我们先明确分片集群要解决的问题: 单节点瓶颈:无论是内存容量还是处理能力(QPS),单个 Redis 实例都有物理上限。高可用性需求:单点故障…

Qt readyRead信号避坑:不产生readyRead信号的解决方法

Qt readyRead信号避坑:不产生readyRead信号的解决方法 引言一、QSerialport的readyRead1.1 版本问题1.2 缓存问题1.3 阻塞问题 二、Q(Tcp)Socket的readyRead2.1 阻塞问题2.2 运行一段时间,突然不发信号2.3 和具体数据有关? 引言 目前没遇到相…

大事件项目记录10-文章分类接口开发-更新文章分类

四、更新文章分类。 CategoryController.java: PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService: //更新分类void update(Category category); …