gpt4 book ai didi

SQL,如何使用动态条件逻辑?

转载 作者:行者123 更新时间:2023-12-02 17:45:05 25 4
gpt4 key购买 nike

当你需要动态WHERE子句时我可以使用;

CREATE PROCEDURE [dbo].[sp_sel_Articles]
@articleId INT = NULL
, @title NVARCHAR(250) = NULL
, @accessLevelId INT = NULL
AS
BEGIN
SELECT *
FROM table_Articles Art
WHERE
(Art.ArticleId = @articleId OR @articleId IS NULL)
AND (Art.Title LIKE '%' + @title + '%' OR @title IS NULL)
AND (Art.AccessLevelId = @accessLevelId OR @accessLevelId IS NULL)
END

因此,我可以通过 ArticleId 调用此过程 - 例如 -

EXEC [sp_sel_Articles] @articleId = 3

但是,有时我需要通过 AccessLevelId 进行调用,有时不需要通过确切的值进行调用。例如,我需要大于或小于给定的 accesslevelId。

当前过程可以通过使用处理EXACT

Art.AccessLevelId = @accessLevelId

是否也可以将 CONDITION 类型以及值提供给过程?在这个例子中可能看起来很奇怪,但请耐心等待:

CREATE PROCEDURE [dbo].[sp_sel_Articles]
@articleId INT = NULL
, @title NVARCHAR(250) = NULL
, @accessLevelId INT = NULL
, **@accessLevelIdCondition**
AS
BEGIN
SELECT *
FROM table_Articles Art
WHERE
(Art.ArticleId = @articleId OR @articleId IS NULL)
AND (Art.Title LIKE '%' + @title + '%' OR @title IS NULL)
AND (Art.AccessLevelId **@accessLevelIdCondition** @accessLevelId OR @accessLevelId IS NULL)
END

也许可以使用一个函数,我不知道。因为,至少有 20 个过程需要这种灵 active ,所以我需要尽可能更好、更全局的解决方案,而不是在每个过程中编写 IF ELSE 条件。

提前致谢,

最佳答案

您可能需要使用动态 SQL 来传递运算符。或者您可以传入两个值,例如

@MinAccessLevelID INT,
@MaxAccessLevelID INT

...
WHERE (
(@MinAccessLevelID IS NULL AND @MaxAccessLevelID IS NULL)
OR
(AccessLevelID >= @MinAccessLevelID AND AccessLevelID <= @MaxAccessLevelID)
)

当您想要精确值(例如仅 3)时,只需将 3 传递给两个值即可。当您想要高于 3 的任何值时,请将 20000000000 传递到 @Max 参数;如果您想要低于 3 的所有值,则传递 0。

但是您会发现,随着这些排列变得更加复杂,您最好只使用动态 SQL(并且设置针对临时工作负载进行优化,这对于计划缓存会更好重用并阻止参数嗅探)。

关于SQL,如何使用动态条件逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395580/

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