Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да намеря низ в цяла база данни?

Това ще работи:

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;

Няколко предупреждения обаче. Първо, това е безобразно бавно и не е оптимизирано . Всички стойности се преобразуват в nvarchar просто за да могат да се сравняват без грешка. Може да срещнете проблеми със стойности като datetime не се преобразуват според очакванията и следователно не се съпоставят, когато трябва (фалшиви отрицания).

WHERE (0 = 1) има, за да направи изграждането на OR клауза по-лесно. Ако няма съвпадения, няма да получите никакви редове обратно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проактивни проверки на състоянието на SQL Server, част 2:Поддръжка

  2. Запазване на ORDER BY в SELECT INTO

  3. 4 начина за изброяване на всички изгледи в база данни на SQL Server

  4. Оптимизиран SQL за дървовидни структури

  5. Вземете граничните стойности за разделена таблица в SQL Server (T-SQL)