在SQL Server中搜索所有表格来找到一个字符串

25 浏览
0 Comments

在SQL Server中搜索所有表格来找到一个字符串

在SQL Server中,有没有办法在数据库的所有表中搜索字符串?

我想要搜索字符串,比如说john。结果应该显示包含john的表及其相应的行。

0
0 Comments

在SQL Server 2012中更新TechDo的答案时,需要将:'FROM ' + + ' (NOLOCK) '更改为FROM ' + + 'WITH (NOLOCK) ' +,否则将出现以下错误:Deprecated feature 'Table hint without WITH' is not supported in this version of SQL Server.

以下是完整更新的存储过程:

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

如何调用这个存储过程?

.VanDenBosch 您将其保存为存储过程,然后执行存储过程。

0
0 Comments

文章标题:在SQL Server中通过搜索所有表找到字符串的方法

有时候我们需要在SQL Server中搜索所有的表来找到特定的字符串。下面介绍了一个出现这个问题的原因以及解决方法。

出现的原因是,SQL Server本身没有提供直接搜索所有表的功能,需要使用第三方工具来实现这个功能。在这里提到了两个工具,一个是ApexSQL Search,另一个是SSMS tools pack。

ApexSQL Search是一个可以集成到SSMS中的第三方工具,可以进行模式和数据搜索。之前它是免费的,但是据2021年来看,它已经不再是免费的了。

另一个工具是SSMS tools pack,它也提供了这个功能,但是对于SQL 2012版本来说是收费的,不过价格相对较为合理。

如果不想使用第三方工具,也可以使用以上提供的存储过程来实现搜索所有表的功能。不过需要注意的是,如果要搜索日期时间列或GUID列等特殊类型的列,可能需要稍作修改。

总结起来,想要在SQL Server中搜索所有表找到特定的字符串,可以选择使用第三方工具,如ApexSQL Search或SSMS tools pack。如果不想使用第三方工具,可以使用以上提供的存储过程来实现。但无论选择哪种方法,都需要注意可能需要对存储过程进行一些修改以适应特殊类型的列。

0
0 Comments

在SQL Server中搜索所有表格来查找一个字符串的问题是出现的原因是需要在生产环境中执行,并且对临时表有限制,所以需要使用表变量和即席查询来代替。解决方法是使用以下的SQL代码:

USE DATABASE_NAME
DECLARE @SEARCH_TEXT nvarchar(100) = 'SEARCH_TEXT'
DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr nvarchar(110)
SET @TableName = ''
SET @SearchStr = QUOTENAME('%' + @SEARCH_TEXT + '%','''')
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', 'int', 'decimal')
                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 ' + @SearchStr
            )
        END
    END    
END
SELECT ColumnName, ColumnValue FROM @Results

这段代码将在指定数据库中搜索所有表格,查找包含指定字符串的列和值。使用一个循环来逐个搜索每个表格和每个列。搜索结果将保存在一个表变量中,并最后将结果返回。

希望这个解决方法对你有帮助!

0