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

Tìm kiếm một chuỗi trong tất cả các bảng, hàng và cột của DB

Mã này sẽ thực hiện được trong SQL 2005, nhưng có một số lưu ý:

  1. Nó rất chậm. Tôi đã thử nghiệm nó trên một cơ sở dữ liệu nhỏ chỉ có một số bảng và mất nhiều phút để hoàn thành. Nếu cơ sở dữ liệu của bạn quá lớn đến mức bạn không thể hiểu được thì dù sao thì cơ sở dữ liệu này có thể sẽ không sử dụng được.

  2. Tôi đã viết điều này ra khỏi còng. Tôi đã không đưa ra bất kỳ xử lý lỗi nào và có thể có một số lỗi cẩu thả khác, đặc biệt là vì tôi không thường xuyên sử dụng con trỏ. Ví dụ:tôi nghĩ có một cách để làm mới con trỏ cột thay vì đóng / phân bổ / tạo lại nó mọi lúc.

Nếu bạn không thể hiểu cơ sở dữ liệu hoặc không biết nội dung đến từ đâu, thì có lẽ bạn nên tìm một người biết. Ngay cả khi bạn có thể tìm thấy dữ liệu ở đâu, nó có thể bị trùng lặp ở đâu đó hoặc có thể có các khía cạnh khác của cơ sở dữ liệu mà bạn không hiểu. Nếu không ai trong công ty của bạn hiểu cơ sở dữ liệu thì bạn đang ở trong một mớ hỗn độn khá lớn.

DECLARE
    @search_string  VARCHAR(100),
    @table_name     SYSNAME,
    @table_schema   SYSNAME,
    @column_name    SYSNAME,
    @sql_string     VARCHAR(2000)

SET @search_string = 'Test'

DECLARE tables_cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

OPEN tables_cur

FETCH NEXT FROM tables_cur INTO @table_schema, @table_name

WHILE (@@FETCH_STATUS = 0)
BEGIN
    DECLARE columns_cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name AND COLLATION_NAME IS NOT NULL  -- Only strings have this and they always have it

    OPEN columns_cur

    FETCH NEXT FROM columns_cur INTO @column_name
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @sql_string = 'IF EXISTS (SELECT * FROM ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' WHERE ' + QUOTENAME(@column_name) + ' LIKE ''%' + @search_string + '%'') PRINT ''' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ', ' + QUOTENAME(@column_name) + ''''

        EXECUTE(@sql_string)

        FETCH NEXT FROM columns_cur INTO @column_name
    END

    CLOSE columns_cur

    DEALLOCATE columns_cur

    FETCH NEXT FROM tables_cur INTO @table_schema, @table_name
END

CLOSE tables_cur

DEALLOCATE tables_cur


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đổi tên lược đồ máy chủ SQL

  2. Phiên bản tiêu chuẩn nén sao lưu SQL Server 2008

  3. Đối sánh Mờ trong SQL

  4. Thoát và khôi phục mọi thứ trong tập lệnh khi bị lỗi

  5. Cách thay đổi cột từ Null thành Không Null trong Bảng SQL Server - Hướng dẫn SQL Server / T-SQL Phần 52