Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果sql中存在或不存在,则使用_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 如果sql中存在或不存在,则使用

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

大家好,我正在用SQL为一个列表编写一个存储过程,例如,我有一个项目列表,我想添加另一个项目,所以我得到MAX(columName),然后添加+1,这将导致最后一个选项。唯一的问题是我是按人过滤的。这意味着我也可以看到其他人的列表并添加内容。当某人还没有项目时,我的存储过程不工作。如何首先检查它是否存在

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。当你可以只运行一个查询时,为什么还要运行多个带有神秘参数的查询呢。我其实不太懂你写的东西,但我查了一些关键词,我明白了。工作起来很有魅力。谢谢