Wha*_*sUP 2 sql-server t-sql sql-server-2012 string-manipulation
在数据库中的表中定位特定单词并在列表中显示表和列的名称。
有太多表无法定位数据库中的特定单词。
这不会很快(这花了一分钟多的时间在我的 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)
归档时间: |
|
查看次数: |
2212 次 |
最近记录: |