我有一个包含一个主表和一些子表的数据库。为了查看数据,我创建了一个C#应用程序,它显示了一个大表。在此应用程序中,用户可以设置过滤器,以仅显示所有数据的一部分。此过滤器有20个不同的参数,每个参数都可以使用或不使用。 为了清楚这个存储过程,我组织它像这样: 对于20个参数中的每一个,我创建一个临时表:
DECLARE @tbl_parameter1 type_Int
DECLARE @tbl_Parameter2 type_Int
...
type_Int是一个用户定义的表类型,只包含一个Int。
类型的列在下一步中,我使用适合filter-parameter的所有行的主表的ID填充这些表。如果没有设置一个参数,我会用所有ID填充它。
ID @parameter1 > 0
BEGIN
INSERT INTO @tbl_parameter1 SELECT ID FROM tbl_main WHERE col1 = @parameter1
END
ELSE
BEGIN
INSERT INTO @tbl_parameter1 SELECT ID FROM tbl_main
END
所以最后我需要在20个临时表中的每一个中出现所有ID: 这一步很慢。
INSERT INTO @Result
SELECT Value FROM @tbl_TestsequenceTags
INTERSECT
SELECT Value FROM @tbl_Source
INTERSECT
SELECT Value FROM @tbl_Vehicle
... (17 more tables)
最后,我将所有另一个存储过程提供给C#应用程序并包含所有连接和联合。
EXEC Get_Data @Result
是否有更好(更快)的解决方案来创建@ result-Table? 或者我应该以其他方式进行过滤?
答案 0 :(得分:2)
为什么不使用一次传递来编写查询?
SELECT ID
FROM tbl_main
WHERE (col1 = @parameter1 OR @paramter1 IS NULL) AND
(col2 = @parameter2 OR @paramter2 IS NULL) AND
. . .;
这需要扫描原始表格。但是,它应该比编写20个临时表更有效 - 其中许多表包含原始数据中所有行的ID。