Sql server 如果sql中存在或不存在,则使用
大家好,我正在用SQL为一个列表编写一个存储过程,例如,我有一个项目列表,我想添加另一个项目,所以我得到MAX(columName),然后添加+1,这将导致最后一个选项。唯一的问题是我是按人过滤的。这意味着我也可以看到其他人的列表并添加内容。当某人还没有项目时,我的存储过程不工作。如何首先检查它是否存在Sql server 如果sql中存在或不存在,则使用,sql-server,stored-procedures,Sql Server,Stored Procedures,大家好,我正在用SQL为一个列表编写一个存储过程,例如,我有一个项目列表,我想添加另一个项目,所以我得到MAX(columName),然后添加+1,这将导致最后一个选项。唯一的问题是我是按人过滤的。这意味着我也可以看到其他人的列表并添加内容。当某人还没有项目时,我的存储过程不工作。如何首先检查它是否存在 DECLARE @MAXID INT SET @MAXID = (SELECT MAX(priority)+1 FROM Chores
DECLARE @MAXID INT
SET @MAXID = (SELECT MAX(priority)+1
FROM Chores
WHERE userID = @user)
UPDATE Chores
SET userID= @user,
priority = @MAXID
FROM
Chores WITH (NOLOCK)
WHERE choreID= @iD
结果当我运行此命令时,我得到项目优先级编号的Null
。我这样假设是因为它没有找到任何东西的MAX()
正如您所看到的,我正在通过给定的个人将+1添加到项目列表中,但是如果用户的列表中还没有某些内容,则我有一个空值。
我相信我可以执行If Exists(),但是如果我从一开始就声明和设置值,那么该如何工作呢。其他参数也正在传入,这就是为什么我不声明它们 我想你想要:
UPDATE Chores
SET userID= @user,
priority = COALESCE(max_priority, 1)
FROM (SELECT c.*, MAX(CASE WHEN userId = @user THEN priority END) OVER () as max_priority
FROM Chores c
) c
WHERE choreID = @iD ;
用您正在使用的数据库标记您的问题。示例数据和期望的结果会有所帮助。我不太熟悉COALESCE。当第一个参数为空时,它会返回第二个参数。对吗?它从左到右运行,返回传递的所有参数中的第一个非空参数,看起来不错,但执行上述操作与执行if exists set maxID=Max(…)else set maxID=1有什么区别?不确定这是否有意义,我可以在这里修改语法。@ppc。当你可以只运行一个查询时,为什么还要运行多个带有神秘参数的查询呢。我其实不太懂你写的东西,但我查了一些关键词,我明白了。工作起来很有魅力。谢谢