sql >> Database >  >> RDS >> Sqlserver

Hoe vind je een string in een hele database?

Dit zal werken:

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;

Toch een paar kanttekeningen. Ten eerste:dit is waanzinnig traag en niet-geoptimaliseerd . Alle waarden worden geconverteerd naar nvarchar zodat ze foutloos kunnen worden vergeleken. U kunt problemen tegenkomen met waarden zoals datetime converteren niet zoals verwacht en worden daarom niet gematcht wanneer ze zouden moeten zijn (valse negatieven).

De WHERE (0 = 1) is er om het bouwen van de OR . te maken clausule makkelijker. Als er geen overeenkomsten zijn, krijg je geen rijen terug.



  1. Postgres-triggerprocedure bij invoegen met behulp van gegevens in ingevoegde velden om berekende gegevens in een ander veld in te voegen

  2. PHP-fout bij verbinding met MS SQL-database met PDO_DBLIB

  3. Django en PostgreSQL instellen op twee verschillende EC2-instanties

  4. geselecteerde waarde haal van db in dropdown-keuzevakoptie met behulp van php mysql-fout