テキストフィールドを使用していますが、同様の目的で数年前に作成したこのスクリプトがあります。適格な列が検出され、それらの列で値が検索されます。非決定論的なスコープがあるため、このようなことよりもうまくできない場合があります。
uniqueidentifier 列を含めるように少し調整することもできます (それが実際のデータ型である場合)。または、like 検索の代わりに equal を使用することもできます。
これが定期的に再利用するものである場合は、共通のテーブルまたは列のリストをフィードして、これらのものを見つけることができるため、見つけるのにそれほど時間がかかりません.
/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/
SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%putYourGuidHere%' --should be formatted as a like search
SET @objectOwner = 'dbo'
DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))
INSERT INTO @potentialcolumns (sql)
SELECT
('if exists (select 1 from [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) where [' +
[cols].[column_name] +
'] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) WHERE [' +
[cols].[column_name] +
'] LIKE ''''' + @valuetosearchfor + '''''' +
'''') as 'sql'
FROM information_schema.columns cols
INNER JOIN information_schema.tables tabs
ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
AND tabs.table_schema = @objectOwner
AND tabs.TABLE_TYPE = 'BASE TABLE'
AND (cols.CHARACTER_MAXIMUM_LENGTH >= (LEN(@valueToSearchFor) - 2) OR cols.CHARACTER_MAXIMUM_LENGTH = -1)
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position
DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
BEGIN
--SELECT @sql --use when checking sql output
EXEC (@sql)
END
SET @iterator = @iterator + 1
END
PRINT ''
PRINT 'Scan completed'
それが不安定に見える場合、スクリプトは次のようなステートメントを実行しています
if exists (select 1 from [schema].[table_name] (NOLOCK)
where [column_name] LIKE '%yourValue%')
begin
print select * from [schema].[table_name] (NOLOCK)
where [column_name] LIKE '%yourValue%'
end
[schema]
...そして、、、およびループ内[table_name]
を置き換えるだけです。[column_name]
%yourValue%
そのフィルタリングは...
- 特定のスキーマ内のテーブル (フィルターは削除可能)
- ビューではなくテーブルのみ (調整可能)
- 検索値を保持する列のみ
- //データ型 (追加
(n)char
または変更、データ型変換を認識する)(n)varchar
(n)text
最後に、出力は結果グリッドに送られません。[メッセージ] ウィンドウを確認します(「N 行が影響を受けています」と表示されている場所)。