我有类似的代码:
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的副本也不是很好的选择,因为它们是非常大的表。
答案 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时,我也不保证性能。