Kode ini harus melakukannya di SQL 2005, tetapi beberapa peringatan:
-
Ini sangat lambat. Saya mengujinya pada database kecil yang saya miliki dengan hanya beberapa tabel dan butuh beberapa menit untuk menyelesaikannya. Jika basis data Anda sangat besar sehingga Anda tidak dapat memahaminya, ini mungkin tidak akan dapat digunakan.
-
Saya menulis ini secara spontan. Saya tidak melakukan penanganan kesalahan dan mungkin ada beberapa kecerobohan lainnya terutama karena saya tidak sering menggunakan kursor. Misalnya, saya pikir ada cara untuk me-refresh kursor kolom daripada menutup/mendeallokasi/membuat ulang setiap saat.
Jika Anda tidak dapat memahami database atau tidak tahu dari mana asalnya, maka Anda mungkin harus menemukan seseorang yang memahaminya. Bahkan jika Anda dapat menemukan di mana data itu berada, itu mungkin diduplikasi di suatu tempat atau mungkin ada aspek lain dari database yang tidak Anda pahami. Jika tidak ada seorang pun di perusahaan Anda yang memahami database, maka Anda berada dalam kekacauan yang cukup besar.
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