在所有表的任何列中搜索字符串

时间:2016-08-12 10:31:04

标签: sql-server search

例如,这是我的ID:07E485

我需要在所有表格中找到此ID

所有可能带有此值的列都是字符串类型...

类似于:select * from **alltables** where **anyColumn**='07E485'

3 个答案:

答案 0 :(得分:0)

以下查询将返回名称中包含yourDBName的数据库07E485中的所有表。

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND
      TABLE_CATALOG = 'yourDBName' AND
      TABLE_NAME LIKE '%07E485%'

如果我误读了您的要求,而您希望在任何数据库中找到精确命名为07E485的所有表,那么您可以使用以下查询:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND
      TABLE_NAME = '07E485'

答案 1 :(得分:0)

在每个数据库中,您都有一个名为INFORMATION_SCHEMA.COLUMNS的视图,您可以使用此视图查询所有表。

这就是我做的方式,如果有人知道更好的方式,感觉自由......:)

SET NOCOUNT ON
DECLARE @Table varchar(255), @Schema varchar(255), @SQL varchar(MAX)

DECLARE table_cursor CURSOR FOR
    SELECT TABLE_NAME, TABLE_SCHEMA
    FROM INFORMATION_SCHEMA.COLUMNS -- This is a system view where you can see all columns of a database.
    WHERE UPPER(COLUMN_NAME) = 'ID' -- This makes sure you don't loop through any tables that don't have a Column called 'ID'.

    OPEN table_cursor
    FETCH NEXT FROM table_cursor INTO @Table, @Schema
    WHILE @@FETCH_STATUS = 0 BEGIN

        -- This part creates your queries.
        SET @SQL = 'SELECT * FROM '+@Schema+'.'+@Table+'
        WHERE CAST(ID as varchar) = ''07E485''' -- Casting ID to varchar to avoid data type errors.

        -- This executes the query.
        EXEC(@SQL)

        -- If a result is found, i.e. ID is equal to '07E485' somewhere in the table, Table name is printed on the "Messages" tab.
        IF @@ROWCOUNT > 0 PRINT @Table

        FETCH NEXT FROM table_cursor INTO @Table, @Schema
    END
    CLOSE table_cursor
    DEALLOCATE table_cursor

要查看哪些表包含id ='07E485',请转到“消息”,您将看到它们的列表。

答案 2 :(得分:0)

更新我的回答完全重写

尝试这样:如果动态SQL等于给定的搜索字符串,则会检查所有字符串类型的列。您可能希望向输出中添加更多数据类型,以便更好地查看表格的行。但是不能简单地放置DECLARE @DateVal DATETIME = '2016-08-12 13:57:15.347' SELECT CAST(@DateVal AS FLOAT) -- 42592,5814276235 DECLARE @FloatVal FLOAT = 42592.5814276235 SELECT CAST(@FloatVal AS DATETIME) -- 2016-08-12 13:57:15.347 ,因为没有额外的努力,XML中不允许存在数据类型。

其次,通过使用SELECT *,我可以避免由于带有空格的列或表名而导致语法错误...

QUOTENAME