如何在整个数据库中查找字符串?

Dio*_*ogo 44 sql database select sql-server-2008

我有一个特定的字符串,例如"123abcd",但我不知道表的名称,甚至不知道我的SQL Server数据库中表的列名.我想用select来查找它并显示相关字符串的所有列,所以我想知道类似于:

select * from Database.dbo.* where * like  '%123abcd%'
Run Code Online (Sandbox Code Playgroud)

由于显而易见的原因,它不起作用,但有一种简单的方法来创建一个select语句来做这样的事情?

Yuc*_*uck 28

这将有效:

DECLARE @MyValue NVarChar(4000) = 'something';

SELECT S.name SchemaName, T.name TableName
INTO #T
FROM sys.schemas S INNER JOIN
     sys.tables T ON S.schema_id = T.schema_id;

WHILE (EXISTS (SELECT * FROM #T)) BEGIN
  DECLARE @SQL NVarChar(4000) = 'SELECT * FROM $$TableName WHERE (0 = 1) ';
  DECLARE @TableName NVarChar(1000) = (
    SELECT TOP 1 SchemaName + '.' + TableName FROM #T
  );
  SELECT @SQL = REPLACE(@SQL, '$$TableName', @TableName);

  DECLARE @Cols NVarChar(4000) = '';

  SELECT
    @Cols = COALESCE(@Cols + 'OR CONVERT(NVarChar(4000), ', '') + C.name + ') = CONVERT(NVarChar(4000), ''$$MyValue'') '
  FROM sys.columns C
  WHERE C.object_id = OBJECT_ID(@TableName);

  SELECT @Cols = REPLACE(@Cols, '$$MyValue', @MyValue);
  SELECT @SQL = @SQL + @Cols;

  EXECUTE(@SQL);

  DELETE FROM #T
  WHERE SchemaName + '.' + TableName = @TableName;
END;

DROP TABLE #T;
Run Code Online (Sandbox Code Playgroud)

但有几点需要注意.首先,这是非常缓慢和非优化的.所有值都被nvarchar简单地转换为可以无错误地进行比较.您可能会遇到问题,例如datetime没有按预期转换,因此在它们应该不匹配时(错误否定).

WHERE (0 = 1)是为了使OR子句更容易构建.如果没有匹配,则不会返回任何行.


小智 13

这里有几个可用于此的免费工具.两者都作为SSMS插件工作.

ApexSQL搜索 - 100%免费 - 搜索表格中的架构和数据.有几个更有用的选项,如依赖关系跟踪......

SSMS工具包 - 除了SQL 2012以外的所有版本都免费 - 看起来不像以前的版本那么先进,但有许多其他很酷的功能.