全テーブル・全カラムの値を文字列検索する
データベース内の全テーブル・全カラムの値を文字列検索する
データベース内で、全てのテーブルの全カラムを対象に、特定の文字が使われていないか調べなくてはいけないような時ないでしょうか?
作る機会があったので、そんな時に使えるスクリプトをここに残しておきます。
データベース内の全テーブル・全カラムの値を文字列検索するスクリプト
こちらが、データベース内の全テーブル・全カラムの値を文字列検索するスクリプトです。
------------------------------------- -- @TextToFind に検索したい文字列を入れてください。 ------------------------------------- DECLARE @TextToFind NVARCHAR(100) = N'design'; --DECLARE @TextToFind NVARCHAR(100) = N'Women''s'; --DECLARE @TextToFind NVARCHAR(100) = N'女'; --DECLARE @TextToFind NVARCHAR(100) = N'0%'; ------------------------------------- -- LIKE operator で使う準備 ------------------------------------- DECLARE @LIKE_TextToFind NVARCHAR(100), @EscapeChar CHAR(1) = '\'; SET @LIKE_TextToFind = REPLACE(@TextToFind, '''',''''''); SET @LIKE_TextToFind = REPLACE(@LIKE_TextToFind, @EscapeChar, @EscapeChar + @EscapeChar); -- ワイルドカードとして使いたい場合はコメントアウトしてください SET @LIKE_TextToFind = REPLACE(@LIKE_TextToFind, '%', @EscapeChar + '%'); SET @LIKE_TextToFind = REPLACE(@LIKE_TextToFind, '_', @EscapeChar + '_'); SET @LIKE_TextToFind = REPLACE(@LIKE_TextToFind, '[', @EscapeChar + '['); SET @LIKE_TextToFind = '%' + @LIKE_TextToFind + '%'; ------------------------------------- -- 検索 ------------------------------------- IF OBJECT_ID(N'tempdb..#SearchResult', N'U') IS NOT NULL DROP TABLE #SearchResult; CREATE TABLE #SearchResult ( SchemaName NVARCHAR(128), TableName NVARCHAR(128), ColumnName NVARCHAR(128), ColumnValue NVARCHAR(MAX) ); DECLARE @SchemaName NVARCHAR(128), @TableName NVARCHAR(128), @ColumnName NVARCHAR(128), @Sql NVARCHAR(MAX); DECLARE crSearch CURSOR LOCAL FAST_FORWARD FOR SELECT s.name, T.name, C.name FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id INNER JOIN sys.columns AS C ON T.object_id = C.object_id INNER JOIN sys.types AS TP ON C.user_type_id = TP.user_type_id WHERE TP.name IN ('char','varchar','text','nchar','nvarchar','ntext','xml') ORDER BY s.name, T.name, C.name; OPEN crSearch; FETCH NEXT FROM crSearch INTO @SchemaName, @TableName, @ColumnName; WHILE @@FETCH_STATUS = 0 BEGIN SET @Sql = 'SELECT ''' + @SchemaName + ''', ''' + @TableName + ''', ''' + @ColumnName + ''', CAST([' + @ColumnName + '] AS NVARCHAR(MAX)) ' + ' FROM [' + @SchemaName + '].[' + @TableName + '] WITH (NOLOCK)' + ' WHERE CAST([' + @ColumnName + '] AS NVARCHAR(MAX)) LIKE N''' + @LIKE_TextToFind + ''' ESCAPE ''' + @EscapeChar + ''''; INSERT INTO #SearchResult EXEC sp_executesql @Sql; FETCH NEXT FROM crSearch INTO @SchemaName, @TableName, @ColumnName; END CLOSE crSearch; DEALLOCATE crSearch; ------------------------------------- -- 結果の表示 ------------------------------------- SELECT * FROM #SearchResult ORDER BY SchemaName, TableName, ColumnName; --DROP TABLE #SearchResult;
検索対象のカラムのデータタイプは char, varchar, text, nchar, nvarchar, ntext, xml としています。
結果をさらにフィルターしたいこともあるかと思ったので、DROP TABLE はコメントアウトしてあります。