子查询有时需要与另一个表联合,我可以放一个IF吗?

时间:2009-11-07 03:49:57

标签: sql-server

我的查询如下:

SELECT *
FROM 
(
        SELECT *
        FROM Server1

        UNION

        SELECT *
        FROM Server2
)

现在,我有子查询的选项:

  1. 仅限服务器1
  2. 仅限服务器2
  3. 服务器1和2
  4. 我想在我的存储过程中有一个参数可以对参数执行按位操作,告诉我是否需要选项1,2或3。

    这可能吗? 还有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

如果任何一方返回其各自的查询,请不要在UNION中使用变量来触发。假设SERVER1和SERVER2具有相同的列,以便UNION能够工作......

使用IF / ELSE:

IF ... 
  SELECT * FROM SERVER1
ELSE IF ...
  SELECT * FROM SERVER2
ELSE
  SELECT *
    FROM (SELECT *
            FROM SERVER1
          UNION
          SELECT *
            FROM SERVER2)

这使用动态SQL:

DECLARE @SQL nvarchar(3000)

    SET @SQL = CASE
                 WHEN ... THEN
                  'SELECT * FROM SERVER1'
                 WHEN ... THEN
                  'SELECT * FROM SERVER2'
                 ELSE
                  'SELECT *
                     FROM (SELECT *
                             FROM SERVER1
                           UNION
                           SELECT *
                             FROM SERVER2)'
               END

EXEC sp_executesql @SQL

答案 1 :(得分:0)

如果你有一个存储过程,那么输入一个参数来做出决定是最好的。如果你只想要三个选项,你可以使用一个位,它可以有三个值(0,1,null)。

但是,您可能希望至少使用一个字节,以便在添加更多服务器时可以拥有更多控制权,但我会使用null来对所有服务器进行连接。

可以,因为您可以在TSQL中使用if语句。

答案 2 :(得分:0)

SELECT * From ServerA WHERE @Server1 = 0
UNION
SELECT * From Server2 WHERE @Server2 = 0

这能让您知道如何继续吗? 此外,它可能会尝试执行所有查询&不返回查询记录(例如,如果您通过@Server1 = 1)。

你可能需要在这里寻找表现。

编辑:如果这不是一个正确的方法,我将不胜感激,如果有人可以用这种方法与其他方法的优点进行解释。