我有幾年前爲了類似目的而創建的這個腳本,儘管有文本字段。它找到符合條件的列,然後在這些列中搜索該值。由於你有一個非確定性的範圍,你可能無法做得比這個更好。
您可能需要稍微調整它以包含uniqueidentifier列 - 如果這實際上是數據類型 - 或者使用等號而不是類似的搜索。
如果這是你要定期重用的東西,你可以給它一個普通表或列的列表來找到這些東西,所以它不需要很長時間才能找到東西。
/*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
數據類型(添加或更改,將cogni zant數據類型轉換)
最後,輸出不會轉到結果網格。檢查消息窗口(您看到「受影響的N行」)
您定義了哪些索引? – mellamokb 2012-07-26 18:27:03
我假設你不知道什麼表的ID在...你知道它可能在什麼專欄? – Randy 2012-07-26 18:28:29
@mellamokb - 好問題 - 所以有一些查詢列(LK_xyz,LK_abc) - 那些索引正確 – Coffee 2012-07-26 18:28:52