Sql 查找数据库中包含特定区分大小写字符串的所有列和表
我想查找数据库中列“Column1”和“Column2”包含特定大小写敏感字符串“aBcD”的所有表。有什么方法可以做到这一点吗 我提出了以下问题。有什么建议吗Sql 查找数据库中包含特定区分大小写字符串的所有列和表,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我想查找数据库中列“Column1”和“Column2”包含特定大小写敏感字符串“aBcD”的所有表。有什么方法可以做到这一点吗 我提出了以下问题。有什么建议吗 SELECT c.name AS ColName, t.name AS TableName FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE c.name = 'Column1' or c.name = 'Column2' and /
SELECT c.name AS ColName, t.name AS TableName
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = 'Column1' or c.name = 'Column2' and
/* column contents is 'aBcD' */ ?
一种解决方案可以是迭代所有找到的表并检查其内容,如下所示:
DECLARE cur CURSOR FOR
SELECT t.name, c.name
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = 'Column1' or c.name = 'Column2'
OPEN cur
CREATE TABLE #output(tablename nvarchar(255), columnname nvarchar(255))
DECLARE @sql nvarchar(max), @tab nvarchar(max), @col nvarchar(max)
FETCH NEXT FROM cur INTO @tab, @col
WHILE(@@FETCH_STATUS = 0) BEGIN
SET @sql = N'
IF(SELECT COUNT(*)
FROM '+@tab+'
WHERE '+@col+' = N''aBcD''
COLLATE Latin1_General_CS_AS) > 0
INSERT INTO #output(tablename, columname)
VALUES(N'''+@tab+''',N'''+@col+''')'
EXEC(@sql)
FETCH NEXT FROM cur INTO @tab, @col
END
SELECT * FROM #output
-- Cleanup
CLOSE cur
DEALLOCATE cur
DROP TABLE #output
几年前,我的好友克里斯·莫里斯(Chris Morris)在一家公司发布了这篇文章。我稍微修改了一下,使它更灵活一点。这将生成一系列select语句,比使用游标快得多。如果您愿意,您可以将结果放入一个变量中并执行它。或者,您可以将其中的几个复制并粘贴到另一个查询窗口中,然后运行它们
DECLARE @MySearchCriteria VARCHAR(500)
SET @MySearchCriteria = '''This user registration has been rejected''' --you do need all these quotation marks because this string is injected to another string.
SELECT 'SELECT ' + c.columnlist + '] FROM [' + t.name + '] WHERE ' + w.whereclause + ';' as SelectStatement
FROM sys.tables t
CROSS APPLY (
SELECT STUFF((
SELECT '], [' + c.Name AS [text()]
FROM sys.columns c
join sys.types t2 on t2.user_type_id = c.user_type_id
WHERE t.object_id = c.object_id
AND c.collation_name IS NOT NULL
AND c.max_length > 6
and t2.name not in ('text', 'ntext')
FOR XML PATH('')
), 1, 2, '' )
) c (columnlist)
CROSS APPLY (
SELECT STUFF((
SELECT ' OR [' + c.Name + '] IN (' + @MySearchCriteria + ')' AS [text()]
FROM sys.columns c
join sys.types t2 on t2.user_type_id = c.user_type_id
WHERE t.object_id = c.object_id
AND c.collation_name IS NOT NULL
AND c.max_length > 6
and t2.name not in ('text', 'ntext')
FOR XML PATH('')
), 1, 4, '' )
) w (whereclause)
where c.columnlist is not null
ORDER BY t.name
您可能希望使用游标在所有表上迭代并查找您的值。您知道我可以对该脚本执行哪些操作以使搜索区分大小写吗?只需在select语句中的终止分号之前添加排序规则。其中“+w.whereclause+”与拉丁文1\u General\u CS\u AS;”