【问题标题】:Search of table names搜索表名
【发布时间】:2012-10-26 11:00:10
【问题描述】:

我使用以下内容在特定数据库的存储过程中搜索字符串:

USE DBname
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%xxx%'

修改上面的内容是否容易,以便在特定的 db "DBname" 中搜索表名?

【问题讨论】:

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


【解决方案1】:

我正在使用它并且工作正常

SELECT * FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%%'

【讨论】:

  • 也包括视图 :-)
  • 适用于视图和表格。
  • 对存储过程使用 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME LIKE '%%'。
  • 我建议使用ILIKE而不是LIKE,使查询不区分大小写
【解决方案2】:
select name
  from DBname.sys.tables
 where name like '%xxx%'
   and is_ms_shipped = 0; -- << comment out if you really want to see them

【讨论】:

  • 注释掉and is_ms_shipped = 0;这一行似乎没什么作用
  • 它通常唯一隐藏的是数据库图表支持表,或者只有一个。在查找函数/过程时更有用。
  • 为什么不添加模式名称? select t.schema_id, s.name, t.Name from DBNAME.sys.tables as t inner join DBNAME.sys.schemas as s on t.schema_id = s.schema_id where t.name like '%yourtabletosearch%' and is_ms_shipped = 0
【解决方案3】:

如果您想查看服务器范围内所有数据库中的所有表并获得输出,您可以使用未记录的sp_MSforeachdb 过程:

sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%Table_Names%'''

【讨论】:

  • 如果您不知道表可能在哪个数据库中,这个答案是唯一有用的答案
【解决方案4】:

您还可以使用“过滤器”按钮来过滤带有特定字符串的表。 您可以对存储过程和视图执行相同的操作。

【讨论】:

    【解决方案5】:

    我假设您想将数据库名称作为参数传递,而不仅仅是运行:

    SELECT  *
    FROM    DBName.sys.tables
    WHERE   Name LIKE '%XXX%'
    

    如果是这样,您可以使用动态 SQL 将 dbname 添加到查询中:

    DECLARE @DBName NVARCHAR(200) = 'YourDBName',
            @TableName NVARCHAR(200) = 'SomeString';
    
    IF NOT EXISTS (SELECT 1 FROM master.sys.databases WHERE Name = @DBName)
        BEGIN
            PRINT 'DATABASE NOT FOUND';
            RETURN;
        END;
    
    DECLARE @SQL NVARCHAR(MAX) = '  SELECT  Name
                                    FROM    ' + QUOTENAME(@DBName) + '.sys.tables
                                    WHERE   Name LIKE ''%'' + @Table + ''%''';
    
    EXECUTE SP_EXECUTESQL @SQL, N'@Table NVARCHAR(200)', @TableName;
    

    【讨论】:

      【解决方案6】:

      我知道这是一个旧线程,但如果您更喜欢不区分大小写的搜索:

      SELECT * FROM INFORMATION_SCHEMA.TABLES 
      WHERE Lower(TABLE_NAME) LIKE Lower('%%')
      

      【讨论】:

        【解决方案7】:

        补充@[RichardTheKiwi] 的回答。

        每当我搜索表格列表时,通常我想从所有表格中选择或删除它们。下面是为您生成这些脚本的脚本。

        生成的选择脚本还添加了一个 tableName 列,以便您知道正在查看的表:

        select 'select ''' + name + ''' as TableName, * from ' + name as SelectTable,
        'delete from ' + name as DeleteTable
        from sys.tables
        where name like '%xxxx%'
        and is_ms_shipped = 0; 
        

        【讨论】:

          【解决方案8】:

          您也可以使用 show 命令。

          show tables like '%tableName%'
          

          【讨论】:

          • 这是标记为 sql-server 的问题上的 MySQL 语法
          【解决方案9】:

          我想为您拥有的每个架构发布一个简单的解决方案。如果您使用的是 MySQL DB,您可以简单地从您的模式中获取所有表的名称并在其上添加 WHERE-LIKE 条件。您也可以使用通常的命令行来执行此操作,如下所示:

          SHOW TABLES WHERE tables_in_<your_shcema_name> LIKE '%<table_partial_name>%';
          

          其中tables_in_&lt;your_shcema_name&gt; 返回SHOW TABLES 命令的列名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多