我有两个具有相同结构的sql server表。在存储过程中,我从第一个表中选择了一个。偶尔我想根据传入的参数从第二个表中进行选择。
我想要一种方法来做到这一点,而无需使用动态SQL或临时表。
答案 0 :(得分:6)
将param = 1传递给union,其他任何东西只返回第一个结果集:
select field1, field2, ... from table1 where cond
union
select field1, field2, ... from table2 where cond AND param = 1
答案 1 :(得分:2)
如果它们都是完全相同的结构,那么为什么没有一个带有参数的表来区分这两个表呢?那时,对于您收到的结果集的参数的案例陈述就变得简单了。
第二种选择是双重结果集。您可以从存储过程中选择多个结果集。然后在代码中,您将使用DataReader.NextResult或DataSet.Tables(1)来获取第二组数据。然后,您的代码有责任将它们放入同一个集合中或合并两个表。
第三种可能性是使用IF声明。比如说,传入一个带有1,2,3预期可能值的整数,然后在实际的存储过程代码中有这样的东西
if @Param = 1 Then
Select From Table1
if @Param = 2 THEN
Select From Table2
if @Param = 3 Then
Select From Table1 Union Select From Table 2
第四种可能性是有两个不同的程序,一个运行一个联合,另一个运行联合,然后让你的代码负责根据该参数确定调用哪一个,如:
myCommandObject.CommandText = IIf(myParamVariable = true, "StoredProc1", StoredProc2")
答案 2 :(得分:1)
这很容易。
/* Always return tableX */
select colA, colB
from tableX
union
select colA, colB
from tableY
where @parameter = 'IncludeTableY' /* Will union with an empty set otherwise */
如果没有立即显现(通常不是),请考虑以下示例。要记住的主要事情是,如果一个行的where子句求值为true,则返回它,否则它将被丢弃。
这总是计算为true,因此返回每一行。
select *
from tableX
where 1 = 1
这总是计算为false,因此不返回任何行(有时用作快速和脏的get-me-the-columns查询)。
select *
from tableX
where 1 = 0
答案 3 :(得分:0)
这将返回任一表中的值,具体取决于您是否在参数
上传递了值select field1, field2, ... from table1 where @p1 is null
union
select field1, field2, ... from table2 where @p1 is not null
您只需要为where子句
添加其余条件答案 4 :(得分:0)
使用视图。
创建view_both 如 SELECT *,1 AS源 FROM table1 UNION ALL SELECT *,2 AS源 FROM table2
SELECT * FROM view_both WHERE source< @source_flag
优化器根据源确定要使用哪个或哪两个表,而不要求对其进行索引。