【问题标题】:Find a specific column entry in an unknown table in a database?在数据库的未知表中查找特定列条目?
【发布时间】:2011-08-14 16:27:38
【问题描述】:

我知道这个话题 (Find a specific column in an unknown table in a database?),我的问题也很相似。我需要的查询与这个非常相似(我认为):

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%watcher%'

但是我需要的是一个列名未知的查询,但我知道内容是什么,我想知道表/列的名称是什么。 (我知道这听起来很奇怪:-/)。 这可能吗?

【问题讨论】:

  • 什么关系型数据库?它需要动态 SQL 来根据搜索字符串实际搜索所有列/所有基于字符的列。
  • 这将是一个繁重的过程,您必须对数据库中每个表的每一列进行查询。您至少可以限制要查找的数据类型吗?
  • 是的,数据类型始终是varchar(至少看起来是)。

标签: sql sql-server sql-server-2008-r2 information-schema


【解决方案1】:

也有帮助

DECLARE @columnName as varchar(100)
SET @columnName = 'ColumnName'

SELECT t.name AS Table, c.name AS Column,
ty.name AS Tipo, c.max_length AS Length
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE c.name LIKE @columnName
ORDER BY t.name, c.name

【讨论】:

    【解决方案2】:
    使用数据库名称 走 SELECT t.name AS table_name, SCHEMA_NAME(schema_id) 作为模式名, c.name AS column_name FROM sys.tables AS t INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID WHERE c.name LIKE '%ColumName start from%' 按模式名、表名排序;

    【讨论】:

      【解决方案3】:

      尝试使用ApexSQL Search - 它同时搜索对象和数据,它是一个类似于 Red Gate 的 SQL 搜索的免费工具。

      如果您不想使用第三方工具,另一种选择是查询,它将使用游标遍历所有表中的所有列,但我担心它会变得过于复杂和性能密集。

      【讨论】:

        【解决方案4】:

        使用SQL Workbench/J可以运行以下语句:

        WbGrepData -searchValue=watcher
        

        它将搜索所有(可访问)表中的所有列,并返回在至少一列中找到搜索词的所有行。

        【讨论】:

          【解决方案5】:

          好的,我认为对于您的问题,您将需要动态 sql,所以首先看一下this link。如果这还不够,那么想到的唯一解决方案就是游标,所以我建议您继续寻找其他解决问题的方法。也就是说,您可以尝试以下代码(但您应该先在小表上进行测试)。

          DECLARE @Query NVARCHAR(MAX), @Column NVARCHAR(100), @Table NVARCHAR(100)
          DECLARE @Search NVARCHAR(100)
          SET @Search = 'Your string'
          
          CREATE TABLE #Results(Table_Name VARCHAR(100), Column_Name VARCHAR(100))
          
          DECLARE Col CURSOR FOR
          SELECT Table_Name, Column_Name
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE COLLATION_NAME IS NOT NULL
          ORDER BY TABLE_NAME, ORDINAL_POSITION
          
          OPEN Col
          FETCH NEXT FROM Col INTO @Table, @Column
          WHILE @@FETCH_STATUS = 0
          BEGIN
              SET @Query = 'IF EXISTS (SELECT * FROM '+QUOTENAME(@Table)+' WHERE '+QUOTENAME(@Column)+'='''+@Search+''')
                              SELECT '''+@Table+''','''+@Column+''''
          
              INSERT INTO #Results
              EXEC sp_executesql @Query
              FETCH NEXT FROM Col INTO @Table, @Column
          END
          CLOSE Col
          DEALLOCATE Col
          
          SELECT * FROM #Results
          

          【讨论】:

            【解决方案6】:

            查看名为SQL Search免费 Red-Gate 工具,它会在整个数据库中搜索任何类型的字符串。

            对于任何 DBA 或数据库开发人员来说,它都是必备工具 - 我是否已经提到它绝对免费可用于任何用途??

            【讨论】:

            • SQL Search 也搜索表上的数据?
            • @Lamak(意识到这是一个非常古老的评论):不,不幸的是它只搜索数据库对象的名称(列、键、约束等)。它仍然回答了恕我直言的问题,并且非常易于使用。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-17
            • 1970-01-01
            • 1970-01-01
            • 2013-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多