假设我们有一个存储过程,它带有@IsAllowed
参数,它是布尔值,如果它传递True
,我应该从两个表A,B
中选择数据(我会用在我的case Union ALL
)否则它传递False
我应该从一个表A
中选择数据......我按照以下方式编写它:
Create PROCEDURE TestSP
(
@IsAllowed bit
)
AS
IF @IsAllowed = 1
BEGIN
Select ID, Username From A
Union ALL
Select ID, Username From B
END
ELSE
Select ID, Username From A
这是最好的方法吗?虽然在我的实际案例中,SP在第一个查询的条件中使用了大约9个参数,这意味着我将编写第一个查询两次并且任何更改在其中我必须注意在两个不同的地方有相同的副本
答案 0 :(得分:0)
试试这个。
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
WHERE @isAllowed = 1
答案 1 :(得分:0)
我对这个查询并不是很疯狂,但是如果你想完全避免二次选择的成本,我认为你必须将它换成临时表。
IF OBJECT_ID('tempdb..#tableA') IS NOT NULL
DROP TABLE #tableA
SELECT ID,Username
INTO #tableA
FROM tableA
IF @isAllowed = 1
BEGIN
SELECT ID,Username
FROM #tableA
UNION ALL
SELECT ID,Username
FROM B
END
ELSE
BEGIN
SELECT ID,Username
FROM #tableA
END
DROP TABLE #tableA
如果您的记录集足够小以至于您不介意放入内存(而不是将其写入磁盘 - 我可以随意将#
表更改为@
表/ O是主要瓶颈之一)。请记住,您必须实际声明表格(使用列定义),而不是SELECT
INTO
。