sql >> Databasteknik >  >> RDS >> Sqlserver

Hur hittar man en sträng i en hel databas?

Detta kommer att fungera:

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;

Ett par varningar dock. För det första, det här är oerhört långsamt och ooptimerat . Alla värden konverteras till nvarchar helt enkelt så att de kan jämföras utan fel. Du kan stöta på problem med värden som datetime konverterar inte som förväntat och matchas därför inte när de borde (falskt negativ).

WHERE (0 = 1) är till för att bygga OR klausul lättare. Om det inte finns några matchningar får du inga rader tillbaka.



  1. PHP-databasklassmönsterfrågor/förslag

  2. Rails konverterar inte tidszon (PostgreSQL)

  3. Failover för PostgreSQL-replikering 101

  4. GET_FORMAT() Exempel – MySQL