在数据库中查找特定单词

Wha*_*sUP 2 sql-server t-sql sql-server-2012 string-manipulation

目标

在数据库中的表中定位特定单词并在列表中显示表和列的名称。

问题

有太多表无法定位数据库中的特定单词。

信息

  • 使用 SQL Server 2012
  • 每个表都使用一个“schemaname.tablename”

Aar*_*and 9

不会很快(这花了一分钟多的时间在我的 AdventureWorks 本地副本中产生 0 个结果)。

DECLARE @SpecificWord NVARCHAR(32);
SET @SpecificWord = N'donut';


DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT NULL,NULL WHERE 1 = 0';
SET @SpecificWord = N'%' + @SpecificWord + N'%';

SELECT @sql += N' UNION ALL SELECT '''
 + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
 + ''',''' + QUOTENAME(c.name) + ''' WHERE EXISTS
 (
   SELECT 1 FROM ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
     + N' WHERE ' + QUOTENAME(c.name) + N' LIKE @s
 )'
FROM sys.columns AS c
INNER JOIN sys.tables AS t
ON c.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.system_type_id IN (35,99,167,175,231,239);

EXEC sys.sp_executesql @sql, N'@s NVARCHAR(32)', @SpecificWord;
Run Code Online (Sandbox Code Playgroud)

如果您sql_variant出于某种原因需要支持(我不建议这样做),则只需要进行一些更改:

DECLARE @SpecificWord NVARCHAR(32);
SET @SpecificWord = N'donut';


DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT NULL,NULL WHERE 1 = 0';
SET @SpecificWord = N'%' + @SpecificWord + N'%';

SELECT @sql += N' UNION ALL SELECT '''
 + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
 + ''',''' + QUOTENAME(c.name) + ''' WHERE EXISTS
 (SELECT 1 FROM ' + QUOTENAME(s.name) + N'.' 
 + QUOTENAME(t.name) + N' WHERE CONVERT(
   NVARCHAR(MAX), ' + QUOTENAME(c.name) 
 + N') LIKE @s)'
FROM sys.columns AS c
INNER JOIN sys.tables AS t
ON c.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.system_type_id IN (35,98,99,167,175,231,239);

EXEC sys.sp_executesql @sql, N'@s NVARCHAR(32)', @SpecificWord;
Run Code Online (Sandbox Code Playgroud)