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

标签 sql database sql-server-2008 select

我有一个特定的字符串,例如“123abcd”,但我不知道表的名称,甚至不知道我的 SQL Server 数据库中表内列的名称。我想通过选择找到它并显示相关字符串的所有列,所以我想知道类似的东西:

select * from Database.dbo.* where * like  '%123abcd%'

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

最佳答案

这会起作用:

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;

不过,有几点需要注意。首先,这是极其缓慢且未优化的。所有值都被简单地转换为 nvarchar,以便可以无误地进行比较。您可能会遇到诸如 datetime 之类的值未按预期转换的问题,因此在应匹配的时候未匹配(漏报)。

WHERE (0 = 1) 是为了让构建 OR 子句更容易。如果没有匹配项,您将得不到任何行。

关于sql - 如何在整个数据库中查找字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435963/

相关文章:

mysql - 条件左连接或Where SQL 查询

javascript - 如何以正确的顺序显示日期? ( react native )

SQL服务器: Check if variable is null and then assign statement for Where Clause

php - Codeigniter:无法使用提供的设置连接到您的数据库服务器

android - 如何安全地实现Facebook登录和设计数据库?

sql-server-2005 - 重新播种一列

sql - 更改选择不同的 SQL 语句以在 SQL Server 2008 上工作

mysql - 使用条件 mysql 获取最大 COUNT(DISTINCT)

asp.net - asp.net 如何去除空格?

SQL Server 2008 Merge 语句多匹配条件