Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để tìm một chuỗi bên trong toàn bộ cơ sở dữ liệu?

Điều này sẽ hoạt động:

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;

Tuy nhiên, một vài lưu ý. Đầu tiên, điều này quá chậm và không được tối ưu hóa . Tất cả các giá trị đang được chuyển đổi thành nvarchar đơn giản để chúng có thể được so sánh mà không có sai sót. Bạn có thể gặp sự cố với các giá trị như datetime không chuyển đổi như mong đợi và do đó không được đối sánh khi chúng phải như vậy (phủ định sai).

WHERE (0 = 1) ở đó để tạo OR mệnh đề dễ dàng hơn. Nếu không có kết quả phù hợp, bạn sẽ không lấy lại được bất kỳ hàng nào.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để thiết lập SQL Server / IIS 7.0 để cho phép trang web ASP.NET MVC truy cập vào cơ sở dữ liệu?

  2. Truy cập tham số đầu ra thủ tục được lưu trữ của SQL Server trong C #

  3. Cách tìm tất cả vi phạm ràng buộc trong cơ sở dữ liệu máy chủ SQL

  4. Cách cập nhật các hàng với một ngày ngẫu nhiên

  5. Tách các từ theo nhóm khôn ngoan cho mỗi hàng trong SQL