如何编写SQL查询,查找数据库中所有列和所有表中的值?

时间:2009-04-01 18:28:25

标签: sql-server sql-server-2008

我正在尝试在我的Microsoft SQL Server 2008数据库中查找值,但我不知道要查看哪个列或表。我正在尝试创建一个只查看所有表和所有表的查询我的价值列。

6 个答案:

答案 0 :(得分:3)

你可能可以使用sys.cols& sys.tables你应该能够创建查询。

这很可能是一个非常长时间运行的查询。

我重新考虑了我的答案,如果您运行下面的查询,它将生成许多sql语句,如果您运行这些语句,您将找到哪个列具有您想要的值。只需将[您的值]替换为适当的值即可。这假设您的值是varchar。

SELECT 'SELECT ''' + TABLE_NAME + '.' + column_name + 
   ''' FROM ' + TABLE_NAME + ' WHERE ' + 
   column_name + ' = ''[your value here]'''
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'varchar';

答案 1 :(得分:1)

您无法在单个查询中执行此操作。您将不得不循环遍历sys.tables和sys.columns信息视图并构造多个查询(每个表一个查询),这将在一个非常长的OR构造中查找您的值的所有字段(每个一个字段)。

答案 2 :(得分:1)

我回过头来写了这篇文章,不再确定它是什么了。我记得在我知道sp_msForEachTable之前!您可能需要调整变量大小(如果您在2005 +上,也可以将它们全部设为MAX)

create proc SearchForValues (@search varchar(100))

as

Begin

declare @i int
declare @tbl varchar(50)
declare @col varchar(50)
declare @sql varchar(500)


create table #TEMP (id int identity (1,1), colname varchar(50), tblname varchar(50))

insert into #TEMP
select a.name, b.name from dbo.syscolumns a inner join
(
select * from dbo.sysobjects where xtype = 'U'
) b
on a.ID = b.ID

create table #SEARCHRESULT (TblName varchar(50), ColName varchar(50))


If isnumeric(@search) = 0 and @search is not null
begin
set @search = '''' + @search + ''''
end

set @i = 1

While @i <= (select max(id) from #TEMP)
   Begin
    select @tbl = tblname from #temp where ID = @i
    select @col = colname from #temp where ID = @i

    set @sql = 'If Exists(select *
                          from   [' + @tbl + ']
                          where  convert(varchar(500), [' + @col + ']) = ' + @search + '
                         )
                     Insert Into #SEARCHRESULT (TblName, ColName) Values(''' + @tbl + ''',''' + @col + ''')'

    execute (@sql)

    set @i = @i + 1
   End

drop table #TEMP
select * from #SEARCHRESULT
drop table #SEARCHRESULT
end

答案 3 :(得分:0)

你不能使用纯SQL。除非您使用的工具(例如Oracle的PL/SQL developer)。

答案 4 :(得分:0)

我冒着在这个不错的1st april天被投票的风险,但我认为在这种情况下grep数据文件会更容易。

答案 5 :(得分:0)

存储过程 sp_msForEachTable 为每个表执行查询。这是一个简单的部分。查看每个表的所有列应该是更难的部分。起初,它们可能具有不同的数据类型。所以你可能只能进行字符串比较。

但是我通过使用系统表和一些系统存储过程中的信息来确保这是可行的。我会尝试找到一个解决方案来访问单个表上的单个列,其中表名和列名仅作为字符串参数给出。此时Dynamic SQL浮现在脑海中。如果你解决了这个问题,那么从系统表中获取包含所有列名的所有表名并将它们连接在一起或将其放入存储过程中应该变得相对简单。如果您找到解决方案,我希望看到结果。