【问题标题】:Searching a value in the whole database [duplicate]在整个数据库中搜索一个值[重复]
【发布时间】:2014-05-30 08:51:49
【问题描述】:

有没有一种方法可以在整个数据库中搜索一个值而不引用它可能存在或不存在的每个表?

例如:

select all.tables from db
where all.tables = value.x

【问题讨论】:

  • SQL 中可能有一种方法可以做到这一点。但是如何转储所有表,然后使用记事本搜索?够了吗?
  • 根据您所在的数据库,可能会执行此操作。几乎所有数据库都有存储表名和列名的元数据表。您可以编写一个程序来选择表名/列名等,然后对它们中的每一个进行循环选择
  • 这似乎是 thisthis 问题的重复,至少对于 SQL Server 而言。
  • 使用 Mysql,我曾经使用 PHPmyAdmin,它会自动构建所有必要的查询。

标签: sql


【解决方案1】:

声明@SearchStr nvarchar(100) SET @SearchStr = '表名'

CREATE TABLE #Results (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', '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 ' + @SearchStr2
            )
        END
    END    
END

SELECT ColumnName, ColumnValue FROM #Results

删除表#结果

【讨论】:

  • 在别处找到了,谢谢
猜你喜欢
  • 2019-05-25
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多