Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

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

To zadziała:

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;

Jednak kilka zastrzeżeń. Po pierwsze, jest to skandalicznie powolne i niezoptymalizowane . Wszystkie wartości są konwertowane na nvarchar po prostu po to, aby można je było bezbłędnie porównać. Możesz napotkać problemy z wartościami takimi jak datetime nie konwertuje zgodnie z oczekiwaniami i dlatego nie jest dopasowywany, gdy powinien (fałszywe negatywy).

WHERE (0 = 1) jest po to, aby zbudować OR klauzula łatwiej. Jeśli nie ma dopasowań, nie odzyskasz żadnych wierszy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać foreach w SQL Server?

  2. wybrać wszystkie bazy danych w sysobjects, które mają tabelę o nazwie „mytable” niezależnie od schematu?

  3. Przechowuj wiele wartości bitowych w jednej kolumnie tabeli

  4. Czy klucze podstawowe są passé?

  5. Strony kodowe i zestawienia SQL Server