【问题标题】:Search for a string in all table columns in database sql在数据库sql的所有表列中搜索一个字符串
【发布时间】:2016-03-17 06:39:34
【问题描述】:

如何在单个查询中搜索与数据库中所有列匹配的值。

我需要像我一样查询吗,或者有什么简单的方法可以实现吗?

我的代码:-

SET @SearchString='search_string' 


SELECT   @SQL = @SQL + 'SELECT CONVERT(VARCHAR(MAX),COUNT(*)) + '' matches in   column ''+'''
     + C.name + '''+'' on table '' + ''' + SC.name + '.' + T.name + 
     ''' [Matches for '''+@SearchString+''':] FROM ' + 
     QUOTENAME(SC.name) + '.' + QUOTENAME(T.name) + ' WHERE ' +   QUOTENAME(C.name) + 
     ' LIKE ''%' + @SearchString + 
     '%'' HAVING COUNT(*)>0 UNION ALL ' +CHAR(13) + CHAR(10) 
FROM     sys.columns C 
JOIN     sys.tables T 
ON       C.object_id=T.object_id 
JOIN     sys.schemas SC 
ON       SC.schema_id=T.schema_id 
JOIN     sys.types ST 
ON       C.user_type_id=ST.user_type_id 
JOIN     sys.types SYST 
ON       ST.system_type_id=SYST.user_type_id 
AND      ST.system_type_id=SYST.system_type_id 
WHERE    SYST.name IN ('varchar','nvarchar','text','ntext','char','nchar') 
ORDER BY T.name, C.name 

IF LEN(@SQL)>12 
SELECT @SQL=LEFT(@SQL,LEN(@SQL)- 12) 

EXEC(@SQL) 

【问题讨论】:

    标签: php sql-server codeigniter


    【解决方案1】:

    你可以试试这段代码,

    exec SearchAllTables @SearchStr='Your search string';
    

    这会对相关数据库中的所有表执行不区分大小写的搜索,并整齐地吐出字符串出现的字段。

    这是存储过程:

    CREATE PROCEDURE SearchAllTables (@SearchStr NVARCHAR(100))
    AS
    BEGIN
        DECLARE @Results TABLE (
            ColumnName NVARCHAR(370)
            ,ColumnValue NVARCHAR(3630)
            )
    
        SET NOCOUNT ON
    
        DECLARE @TableName NVARCHAR(256)
            ,@ColumnName NVARCHAR(128)
            ,@SearchStr2 NVARCHAR(110)
    
        SET @TableName = ''
        SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%', '''')
    
        WHILE @TableName IS NOT NULL
        BEGIN
            SET @ColumnName = ''
            SET @TableName = (
                    SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                    FROM INFORMATION_SCHEMA.TABLES
                    WHERE TABLE_TYPE = 'BASE TABLE'
                        AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                        AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
                    )
    
            WHILE (@TableName IS NOT NULL)
                AND (@ColumnName IS NOT NULL)
            BEGIN
                SET @ColumnName = (
                        SELECT MIN(QUOTENAME(COLUMN_NAME))
                        FROM INFORMATION_SCHEMA.COLUMNS
                        WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
                            AND TABLE_NAME = PARSENAME(@TableName, 1)
                            AND DATA_TYPE IN (
                                'char'
                                ,'varchar'
                                ,'nchar'
                                ,'nvarchar'
                                )
                            AND QUOTENAME(COLUMN_NAME) > @ColumnName
                        )
    
                IF @ColumnName IS NOT NULL
                BEGIN
                    INSERT INTO @Results
                    EXEC (
                            'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                    FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                            )
                END
            END
        END
    
        SELECT ColumnName
            ,ColumnValue
        FROM @Results
    END
    

    【讨论】:

    • 感谢帮助..我是sql server的初学者。这个存储过程可以直接申请还是需要自定义?
    • 无需自定义。只需运行并检查结果。如果您不会得到预期的结果,请告诉我。
    • 我已经执行了查询,该过程已创建并在 mssql management studio 2014 中获得输出。请告诉我如何在我的 php codeigniter 查询中使用此过程
    • 我得到了查询。再次感谢。有点耗时我认为这是正常的吗?有没有提高执行速度?
    • 这里如何搜索多个搜索字符串 ?exec SearchAllTables @SearchStr='你的搜索字符串';
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多