Mã này sẽ thực hiện được trong SQL 2005, nhưng có một số lưu ý:
-
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.
-
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