我迷失在一个大数据库中,无法找到我获得的数据来自哪里。我想知道是否可以使用 SQL Server 2005 在数据库的所有表、行和列中搜索字符串?
有人知道是否可能以及如何实现吗?
最佳答案
此代码应该在 SQL 2005 中执行此操作,但有一些注意事项:
速度慢得离谱。我在一个只有少数表的小型数据库上测试了它,花了很多分钟才能完成。如果您的数据库太大以至于您无法理解它,那么这可能无论如何都无法使用。
这是我即兴写下的。我没有进行任何错误处理,并且可能存在其他一些草率,特别是因为我不经常使用游标。例如,我认为有一种方法可以刷新列光标,而不是每次都关闭/解除分配/重新创建它。
如果您无法理解数据库或不知道数据从何而来,那么您可能应该找到懂的人。即使您可以找到数据的位置,它也可能在某个地方重复,或者数据库的其他方面可能是您不理解的。如果您公司中没有人了解数据库,那么您就会陷入一团糟。
DECLARE
@search_string VARCHAR(100),
@table_name SYSNAME,
@table_schema SYSNAME,
@column_name SYSNAME,
@sql_string VARCHAR(2000)
SET @search_string = 'Test'
DECLARE tables_cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
OPEN tables_cur
FETCH NEXT FROM tables_cur INTO @table_schema, @table_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE columns_cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name AND COLLATION_NAME IS NOT NULL -- Only strings have this and they always have it
OPEN columns_cur
FETCH NEXT FROM columns_cur INTO @column_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql_string = 'IF EXISTS (SELECT * FROM ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' WHERE ' + QUOTENAME(@column_name) + ' LIKE ''%' + @search_string + '%'') PRINT ''' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ', ' + QUOTENAME(@column_name) + ''''
EXECUTE(@sql_string)
FETCH NEXT FROM columns_cur INTO @column_name
END
CLOSE columns_cur
DEALLOCATE columns_cur
FETCH NEXT FROM tables_cur INTO @table_schema, @table_name
END
CLOSE tables_cur
DEALLOCATE tables_cur
关于sql - 在数据库的所有表、行和列中搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591853/