查询记录而不知道它驻留在哪个表中

时间:2014-05-05 14:00:38

标签: sql sql-server

我有大约100多个表,所有表都有一个列ID(主键)。

我的任务是,当用户输入ID号时,我需要找到该记录所属的表,然后从该表中检索所有数据。

我想到了以下选项,但它们无效,因为:

  1. UNION:表太多,每个表都有不同的列。
  2. 视图:每张表中的数据都经常更新。
  3. 还有其他选择吗?

    p / s:由于要求,我必须避免使用T-SQL。

3 个答案:

答案 0 :(得分:3)

这听起来像糟糕的数据库设计,但你可以这样做:

构建一个新表,用于存储项目所在的ID号和表。

使用偶尔运行的存储过程填充此表(取决于获取新记录的频率)。您也可以在添加记录时运行此存储过程。

现在,您可以查询一个表以确定需要查询的位置,并使用第二个查询来获取正确的数据。我认为,这不是理想的,但比其他选择更快。

答案 1 :(得分:0)

我意识到你明确表示你不能使用T-SQL。但是,出于参考目的,以及那些没有相同限制的人:

EXEC sp_MSforeachtable @command1="SELECT * FROM ? WHERE ID = [x]"

这将对数据库中的所有表进行查询,其中?是tablename的占位符。 但请注意,这是一个未记录的SP,可能会在将来的版本中放弃。

答案 2 :(得分:0)

试试这个。 @MagicNumber是您要查找的ID值。此SQL还考虑了没有ID列的表。

你的意思是你不想要一个SQL答案吗?因为你的尝试似乎暗示相反,(UNION,VIEW)。即使您不想要T-SQL答案,并且希望使用类似SSIS的东西,您仍然需要编写T-SQL来解决它。这就是我使用T-SQL发布您的解决方案的原因。

如果这不能解决您的问题,请在您说时展开您要找的内容, “p / s:由于要求,我必须避免使用T-SQL。” (原文如此)。

declare @MagicNumber int; set @MagicNumber=10
declare @st varchar(max)


DECLARE @name varchar(1000)
DECLARE db_cursor CURSOR FOR 

select st.name
from sys.tables ST
join sys.columns SC on sc.object_id = st.object_id
where sc.name = 'ID'

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name

WHILE @@FETCH_STATUS = 0 
BEGIN 
set @st='
if exists (select 1 from '+@name+' where ID='+cast(@MagicNumber as varchar(100))+')
begin
select '''+@name+''' as [Table Name]
select * from '+@name+'
end
'
-- select @name, @st
exec (@st)

FETCH NEXT FROM db_cursor INTO @Name
END 

CLOSE db_cursor 
DEALLOCATE db_cursor