你好!
所以,在一个存储过程中,我想做一个由参数决定的条件并集,我该怎么做呢?
下面是我的“不工作”程序:
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,我想没有并集。
我用一个动态varchar查询完成了这个过程,最后我用一个exec执行查询。但是这显然效率较低,而且你可以用动态查询进行sql注入(这是针对asp.net应用程序的)。我决定改变我所有的存储过程
在IF子句中无法执行并集?
感谢所有的答案没有例外..
4条答案
按热度按时间lnvxswe21#
通常,要执行基于大小写的联合,需要将伪
进入
对于您的查询,它变为
但是,由于在此特定查询中,数据来自同一个表,只是来自不同的筛选器,因此您应该对筛选器执行OR运算。**注意:***如果使用了UNION ALL,则无法通过这种方式进行约简,因为UNION ALL可能会保留重复项。对于UNION(无论如何都会删除重复项),OR约简效果很好 *
5gfr0r5j2#
您可以使用
where
子句来选择并集的任一端:在您的示例中,可以完全省略
IF
语句,因为没有任何地址的ID_ADDRESS为-1。pcrecxhr3#
你能不能把你的查询重写成这样:
如果
@obligedid
等于-1,它将找不到ID,因此不会返回该行。如果它是有效的ID,则它将返回该行沿着第一个查询中返回的行。bybem2ql4#
我很好奇,使用一个select语句,然后使用两个where语句,但用一个或类似的语句将它们分开,这样会不会不起作用