我正在 SQL Server Management Studio 中创建一个存储过程,在其中根据用户的 MS ID 在表中搜索特定行。该请求是从 Web 应用程序中的表单发送的,其中用户已更新其信息,并且存储过程会搜索记录以执行更新。
这是我得到的:
BEGIN
SELECT *
FROM [MY_USER_TABLE]
WHERE MSID = @MSID
IF (@FName != FName)
UPDATE [MY_USER_TABLE]
SET FName = @FName
END
IF (@LName != LName)
UPDATE [MY_USER_TABLE]
SET LName = @LName
END
IF (@MSID != MSID)
UPDATE [MY_USER_TABLE]
SET MSID = @MSID
END
-- ...
-- [several other similar IF statements]
-- ...
END
我遇到的问题是我在 IF 语句中收到一条错误消息“无效的列名称”:
IF (@FName != FName)
但是,当我将其设置为参数时,列名称似乎很好:
SET FName = @FName
我的查询在与参数进行比较时无法识别列名是否有原因?有没有更好的方法来比较参数值和列字段值,看看它们是否不同并需要更新?
MS SQL Server 错误系统非常正确。在
IF (@FName != FName)
中,变量 Fname
未定义。此外,正如评论中所说,多次更新比一次更新更糟糕。系统为每次更新运行单独的事务。你可以做这样的事情。
update my_user_table set
FName = isnull(nullif(FName, @FName),FName),
LName = isnull(nullif(LName, @LName),LName),
MSID = isnull(nullif(MSID, @MSID),MSID)
where MSID = @MSID
或者更简单
update my_user_table set
FName = @FName,
LName = @LName)
where MSID = @MSID