1. ホーム
  2. sql

DBのすべてのテーブル、行、列から文字列を検索する

2023-08-10 03:38:30

質問

私は大きなデータベースで迷子になっており、取得したデータがどこから来たのか見つけることができません。SQL Server 2005 で、データベースのすべてのテーブル、行、および列で文字列を検索することが可能かどうか、疑問に思っています。

それが可能かどうか、また、どのように可能かどうか、どなたかお分かりになりますか?

どのように解決するのですか?

このコードでSQL2005でできるはずですが、いくつか注意点があります。

  1. 非常に遅いです。私が持っているわずかなテーブルしかない小さなデータベースでテストしたところ、完了するまでに何分もかかりました。もし、あなたのデータベースが理解できないほど大きいのであれば、これはおそらく、いずれにせよ使用不可能でしょう。

  2. 私はこれを即席で書きました。エラー処理は入れていませんし、特にカーソルを頻繁に使用するわけではないので、他のずさんな部分もあるかもしれません。たとえば、列カーソルを毎回閉じたり、解放したり、再作成したりするのではなく、リフレッシュする方法があると思うのですが。

もしあなたがデータベースを理解できない、あるいは、ものがどこから来るのかわからないのであれば、おそらく理解できる人を見つけるべきです。データがある場所を見つけることができたとしても、それはどこかで重複しているかもしれませんし、データベースの他の側面であなたが理解していないことがあるかもしれません。もし社内で誰もデータベースを理解していなければ、かなり大きな混乱に陥ります。

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