我想在我的数据库中找到列“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
/* column contents is 'aBcD' */ ?
答案 0 :(得分:2)
一种解决方案可能是迭代所有找到的表并检查它们的内容如下:
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
答案 1 :(得分:0)
我的好友克里斯莫里斯在sqlservercentral.com几年前发布了此消息。我略微修改它以使其更灵活。这将生成一系列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