Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie finde ich eine Zeichenfolge in einer ganzen Datenbank?

Das wird funktionieren:

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;

Ein paar Vorbehalte, aber. Erstens, das ist unverschämt langsam und nicht optimiert . Alle Werte werden in nvarchar umgewandelt einfach, damit sie fehlerfrei verglichen werden können. Es können Probleme mit Werten wie datetime auftreten konvertieren nicht wie erwartet und werden daher nicht zugeordnet, wenn sie es sein sollten (falsche Negative).

Der WHERE (0 = 1) ist da, um den Aufbau des OR zu machen Klausel einfacher. Wenn es keine Übereinstimmungen gibt, erhalten Sie keine Zeilen zurück.