当前位置: 首页 > wzjs >正文

广州专业网站制作设计高端定制网站建设公司

广州专业网站制作设计,高端定制网站建设公司,驻马店营销型网站建设,西直门网站建设公司使用场景:知道表名,同时知道这个表中含有某个字符串,但是不知道这个字符串是在表的哪些列,在列比较多的情况下,查询很麻烦,通过以下语句或者封装的存储可以查出字符串在哪些列出现。结果集里 ContainsValue…

       使用场景:知道表名,同时知道这个表中含有某个字符串,但是不知道这个字符串是在表的哪些列,在列比较多的情况下,查询很麻烦,通过以下语句或者封装的存储可以查出字符串在哪些列出现。结果集里 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.dtcms.com/wzjs/82305.html

相关文章:

  • 中建一局招聘网西安seo网站管理
  • 邢台做移动网站哪儿好江西省水文监测中心
  • wordpress 版权求职seo服务
  • 上饶商城网站建设百度渠道开户哪里找
  • 科技加盟网站建设中国十大品牌策划公司
  • 遂宁网站建设seo技术优化
  • 中企动力骗子公司真的还是假的站长工具seo综合查询官网
  • 霸县网站建设北京seo公司有哪些
  • 网站开发公司代理宁波seo快速优化教程
  • 云南做网站广东新闻今日最新闻
  • 国外psd免费下载网站广州网站建设方案维护
  • 国外网站拼邮需要怎么做seo就业
  • 潍坊做网站公司推广优化
  • 网站地图生成工具西安网站建设优化
  • 价格优化网站建设今日十大热点新闻事件
  • java网站开发框架搭建手册排名网
  • 网站建设电销女生做sem还是seo
  • 软件开发工程师薪资待遇网页优化方法
  • 手机网站建设 广州线上营销推广的公司
  • wordpress内容模型百度搜索引擎优化相关性评价
  • 做网站服务器权限设置网站seo优化外包顾问
  • 管庄网站建设搜索关键词的方法
  • 邢路桥建设总公司网站seo查询网站是什么
  • 渭南哪家公司可以做网站制作公司网站大概多少钱
  • sns网站建设哪家公司好百度收录入口
  • 网站面包屑导航推广赚钱的软件
  • dedecms网站地图 显示三级栏目seo是什么服务器
  • 广州电商网站开发公司个人永久免费自助建站
  • 网站建设中企动力推荐申请网址怎么申请的
  • 网站 qq在线客服修改谷歌google 官网下载