我有大约100多个表,所有表都有一个列ID(主键)。
我的任务是,当用户输入ID号时,我需要找到该记录所属的表,然后从该表中检索所有数据。
我想到了以下选项,但它们无效,因为:
还有其他选择吗?
p / s:由于要求,我必须避免使用T-SQL。
答案 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