Jak znaleźć ciąg znaków w całej bazie danych?

Mam jeden określony ciąg, na przykład „123abcd”, ale nie znam nazwy tabeli ani nawet nazwy kolumny w tabeli w mojej bazie danych SQL Server. Chcę go znaleźć z zaznaczeniem i pokazać wszystkie kolumny powiązanego ciągu, więc zastanawiałem się nad czymś takim:

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

Z oczywistych powodów to nie działa. Czy istnieje prosty sposób na utworzenie instrukcji select, aby zrobić coś takiego?

1 odpowiedź

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;

Jest jednak kilka zastrzeżeń. Po pierwsze, jest to rozwiązanie wolne i niezoptymalizowane. Wszystkie wartości są konwertowane na nvarchar po prostu, aby można je było porównać bez błędów. Możesz napotkać problemy z wartościami takimi jak data i godzina, które nie są konwertowane zgodnie z oczekiwaniami, a zatem nie są dopasowane w odpowiednim czasie (fałszywe negatywy).

WHERE (0 = 1) ma ułatwić budowanie klauzuli OR. Jeśli nie ma dopasowań, nie odzyskasz żadnych wierszy.

Twoja odpowiedź

Zaloguj się aby odpowiedzieć.

Operiada

Operiada to polskojęzyczne forum informatyczne działające na zasadzie pytań i odpowiedzi.

Obserwowane tagi

Zaloguj się aby obserwować tagi.