このコードは SQL 2005 でそれを行う必要がありますが、いくつかの注意事項があります:
<オール> <リ>それは途方もなく遅いです。ほんの一握りのテーブルしかない小さなデータベースでテストしましたが、完了するまでに何分もかかりました。データベースが大きすぎて理解できない場合、これはおそらく使用できません。
<リ>私は袖口からこれを書きました。特にカーソルを頻繁に使用しないため、エラー処理は一切行っていません。たとえば、列カーソルを毎回閉じる/割り当て解除/再作成する代わりに、列カーソルを更新する方法があると思います。
データベースを理解できない場合や、データがどこから来ているのかわからない場合は、理解できる人を見つける必要があります。データの場所がわかったとしても、どこかに重複している可能性や、理解できないデータベースの別の側面がある可能性があります。社内に誰もデータベースを理解していない場合、かなり混乱しています。
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