sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan finder man en streng inde i en hel database?

Dette vil virke:

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;

Et par forbehold dog. For det første, dette er uhyrligt langsomt og ikke-optimeret . Alle værdier konverteres til nvarchar simpelthen så de kan sammenlignes uden fejl. Du kan støde på problemer med værdier som datetime konverterer ikke som forventet og bliver derfor ikke matchet, når de skulle være (falske negativer).

WHERE (0 = 1) er der for at bygge OR klausul lettere. Hvis der ikke er match, får du ingen rækker tilbage.



  1. MySQL-datakilden vises ikke i Visual Studio

  2. Oversigt over server-side programmering i PostgreSQL

  3. Tjek om mysql-databasen eksisterer, udfør handling baseret på resultatet

  4. Hvordan importerer man mere end 100.000 poster til en mysql-database?