选择之前在两个表之间进行选择

时间:2017-08-25 19:58:45

标签: sql-server

我有类似的代码:

IF @a = 'does not matter'
  SELECT /* 500+ lines long query */ FROM TABLE_A;
ELSE
  SELECT /* 500+ lines long query */ FROM TABLE_B;

代码执行它应该做的事情,但维护它是一件痛苦的事。我讨厌这段代码,我讨厌我做到了。第一个查询的每个更改都需要重现到第二个查询(查询是相同的),并且此任务很容易出错。

那么,有没有办法创建一种指针'到SQL Server中的表?类似的东西:

DECLARE @table AS TABLE_REF;

IF @a = 'does not matter'
  SET @table = TABLE_A;
ELSE
  SET @table = TABLE_B;

SELECT /* 500+ lines long query */ FROM @table;

我不是在寻找动态查询解决方案。我已经知道我可以将此查询构建为字符串并使用sp_executesql运行它。我想知道是否有另一种解决方案,因为我的代码根本不是动态的,事实上它是静态的。我只有两种可能性,我想在它们之间做出选择。

另外,创建TABLE_A或TABLE_B的副本也不是很好的选择,因为它们是非常大的表。

3 个答案:

答案 0 :(得分:3)

动态查询可能是最佳解决方案。

或者,您可以为表创建一个SYNONYM

IF @a = 'does not matter'
  CREATE SYNONYM TABLE_NEW FOR TABLE_A;
ELSE
  CREATE SYNONYM TABLE_NEW FOR TABLE_B;

SELECT /* 500+ lines long query */ FROM TABLE_NEW

DROP  SYNONYM TABLE_NEW 

答案 1 :(得分:0)

也许

DECLARE @SQL AS NVARCHAR(4000);

DECLARE @A AS VARCHAR(40);

DECLARE @TABLE_NAME AS VARCHAR(40);

BEGIN

IF @A='BLABLA'
    @TABLE_NAME='MARIA'
ELSE
    @TABLE_NAME='JOSE'
EXEC sp_executesql CONCAT('SELECT * FROM ', @TABLE_NAME, ' WHERE BLA BLA BLA');

END

答案 2 :(得分:0)

如果没有关于实际查询或表格的更多详细信息,我们很难想出一个我们知道可行的创意解决方案。

这样的事情

SELECT /* 500+ lines long query */ FROM 
(SELECT * , A as tableName from TABLE_A
  UNION ALL
 SELECT * , B from TABLE_B) as x
 Where x.tableName = @a

这假设您的两个表具有相同的列数,顺序,类型等,或者您必须更新它以选择匹配的列集。在做两个大表的UNION时,我也不保证性能。