gpt4 book ai didi

sql - 存储过程中的条件 UNION

转载 作者:行者123 更新时间:2023-12-02 09:01:52 24 4
gpt4 key购买 nike

你好!

因此,在存储过程中,我想执行由参数决定的条件并集。我怎样才能做到这一点?

这是我的“不起作用”程序:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[spp_GetAdressesList]

@OnlyLinked bit = 1,
@ObligedId int = -1
AS
BEGIN

SELECT
[ID_ADRESS]
,[ID_ENT]
,[VOI_ADRESS]
,[NUM_ADRESS]
,[BTE_ADRESS]
,[CP_ADRESS]
,[VIL_ADRESS]

FROM [ADRESSES]
WHERE
(

(VIL_ADRESS != 'NC' AND VIL_ADRESS != '--')
AND
(@OnlyLinked = 0 OR ID_ENT is not null)

)

IF (@ObligedId != -1)
BEGIN
UNION
SELECT
[ID_ADRESS]
,[ID_ENT]
,[VOI_ADRESS]
,[NUM_ADRESS]
,[BTE_ADRESS]
,[CP_ADRESS]
,[VIL_ADRESS]

FROM [ADRESSES]
WHERE
ID_ADRESS = @ObligedId
END

END

因此,如果 @ObligedId est = a -1 我希望没有 UNION。

我用动态 varchar 查询做了这个,最后我用 exec 执行查询。但它显然效率较低,您可以使用动态查询进行sql注入(inject)(适用于asp.net应用程序)。我决定更改所有存储过程

不能在 IF 子句中进行并集吗?

感谢所有的回答,无一异常(exception)。

最佳答案

通常要进行基于案例的联合,您需要转换伪变量

select 1 AS A
IF @b!=-1 then
union all
select 2 as B
END IF

进入

select 1 AS A
union all
select 2 as B WHERE @b!=-1 -- the condition covers the entire select
-- because it is a variable test, SQL Server does it first and
-- aborts the entire part of the union if not true

对于您的查询,这将变为

SELECT 
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
(
(VIL_ADRESS != 'NC' AND VIL_ADRESS != '--')
AND
(@OnlyLinked = 0 OR ID_ENT is not null)
)
UNION
SELECT
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
ID_ADRESS = @ObligedId
AND (@ObligedId != -1)

但是,由于在此特定查询中,数据来自同一个表,只是不同的过滤器,因此您需要对过滤器进行“或”操作。 注意: 如果您使用过 UNION ALL,则无法以这种方式减少它,因为 UNION ALL 可能会保留重复项。对于 UNION(无论如何都会删除重复项),OR 缩减效果很好

SELECT 
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
(
(VIL_ADRESS != 'NC' AND VIL_ADRESS != '--')
AND
(@OnlyLinked = 0 OR ID_ENT is not null)
)
OR
(
ID_ADRESS = @ObligedId
AND (@ObligedId != -1) -- include this
)

关于sql - 存储过程中的条件 UNION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4746192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com