我有一个这样的脚本在这里飞来飞去。您可以使用它作为开始。
它从目录中获取感兴趣的列的列表,对它们进行迭代并使用动态 SQL 查询它们。
DECLARE @searched_value nvarchar(MAX) = 'a'; -- set to the value you search for
SET NOCOUNT ON;
DECLARE @schema_name sysname;
DECLARE @table_name sysname;
DECLARE @column_name sysname;
DECLARE @sql nvarchar(MAX);
DECLARE @result TABLE ([schema_name] sysname,
[table_name] sysname,
[column_name] sysname,
[value] nvarchar(MAX));
DECLARE cursor_all_columns CURSOR
LOCAL
FAST_FORWARD
FOR
SELECT s.name,
o.name,
c.name
FROM sys.schemas s
INNER JOIN sys.all_objects o
ON o.schema_id = s.schema_id
INNER JOIN sys.all_columns c
ON c.object_id = o.object_id
INNER JOIN sys.types y
ON y.user_type_id = c.user_type_id
WHERE o.type = 'U' -- set to 'V' for views
AND lower(y.name) IN ('char',
'nchar',
'varchar',
'nvarchar'); -- include more types if needed
OPEN cursor_all_columns;
FETCH NEXT FROM cursor_all_columns
INTO @schema_name,
@table_name,
@column_name;
WHILE @@fetch_status = 0
BEGIN
SET @sql = N'SELECT ''' + quotename(@schema_name) + N''',' + nchar(13) + nchar(10)
+ N' ''' + quotename(@table_name) + N''',' + nchar(13) + nchar(10)
+ N' ''' + quotename(@column_name) + N''',' + nchar(13) + nchar(10)
+ N' ' + quotename(@column_name) + N'' + nchar(13) + nchar(10)
+ N' FROM ' + quotename(@schema_name) + N'.' + quotename(@table_name) + N'' + nchar(13) + nchar(10)
+ N' WHERE lower(' + quotename(@column_name) + N') LIKE N''%' + lower(replace(replace(replace(@searched_value, '%', '!%'), '[', '!['), ']', '!]')) + N'%'' ESCAPE ''!'';' + nchar(13) + nchar(10);
INSERT INTO @result
EXEC sp_executesql @sql;
FETCH NEXT FROM cursor_all_columns
INTO @schema_name,
@table_name,
@column_name;
END;
CLOSE cursor_all_columns;
DEALLOCATE cursor_all_columns;
SELECT [schema_name],
[table_name],
[column_name],
[value]
FROM @result;
Is 适用于表格,但如果您将对象类型从 更改为 ,它也应该适用于'U'
视图'V'
。(尽管表格可能更有趣。)但不能保证。
设置您在开始时搜索的值。
如果它包含搜索的值,它会搜索该类型的任何列(n)(var)char
,不区分大小写。如果您想要包含从字符串类型派生的任何自定义类型,则必须相应地对其进行调整。
输出是模式、表(或视图)名称、列名称和匹配的值(如果多行包含该列中的搜索值,则该列可能会被列出多次)。
(免责声明:可能有改进的空间或错误。)