我的查询如下:
SELECT *
FROM
(
SELECT *
FROM Server1
UNION
SELECT *
FROM Server2
)
现在,我有子查询的选项:
我想在我的存储过程中有一个参数可以对参数执行按位操作,告诉我是否需要选项1,2或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
)。
你可能需要在这里寻找表现。
编辑:如果这不是一个正确的方法,我将不胜感激,如果有人可以用这种方法与其他方法的优点进行解释。