gpt4 book ai didi

sql - 每次 vs 查询覆盖值以查看值是否已更改

转载 作者:行者123 更新时间:2023-12-04 18:11:23 25 4
gpt4 key购买 nike

我有一列,只有当我传递给存储过程的值与列中的值不同时,我才想更新该列。如果重要的话,它恰好是一个 NVARCHAR(255) 列。

每次都写这个值有什么好处和坏处?首先检查值并仅在我传入的内容与数据库中的内容不同时才写入的优缺点是什么?

我在编写之前进行比较的简化示例:

-- @URL and @ContentName are parameters of the sproc    

SET @ExistingURL =
(SELECT TOP 1 C.URL
FROM Content C
WHERE ContentName = @ContentName)

-- update only if the parameter and existing value are different
IF(@ExistingURL != @URL)
BEGIN
UPDATE Content
SET URL = @URL
WHERE ContentName = @ContentName
END

最佳答案

看起来您的查询可以按如下方式重写,而无需将任何内容放入局部变量中。

UPDATE dbo.Content
SET URL = @URL
WHERE ContentName = @ContentName
AND URL <> @URL;

假设 ContentName是唯一的,这将影响 0 或 1 行。无需通过将 URL 的检查拉到单独的查询中来使逻辑更复杂。 “仅在需要时写入”部分由 WHERE 处理。条款。

现在,如果您要将其扩展到多个列进行更新,那么您所追求的并不是那么简单(而且我认为这不值得)。例如,假设有另一个列名 title ,并且您有一个名为 @title 的变量。 .您预测只更新 URL 会很聪明。当它改变时,只更新 title当它改变时。理论上,您可以通过多种方式完成此操作(请记住,这一切都假设变量和列都不可为空 - 如果它们是,它不会改变这些方法,只是使语法有点更令人生畏):
  • 运行两个独立的更新
    UPDATE dbo.Content SET URL = @URL
    WHERE ... -- actual where clause
    AND URL <> @URL;

    UPDATE dbo.Content SET title = @title
    WHERE ... -- same where clause
    AND title <> @title;
  • 有条件地更新
    UPDATE dbo.Content
    SET URL = CASE WHEN URL <> @URL THEN @URL ELSE URL END,
    title = CASE WHEN title <> @title THEN @title ELSE title END
    WHERE ... -- same where clause
    AND (URL <> @URL OR title <> @title);

  • 我怀疑后者不会比写这个更自然的方式表现更好,因为无论如何你都在锁定并写入行(但除了迈克的认可之外,我没有任何可靠的证据上面的评论):
    UPDATE dbo.Content
    SET URL = @URL, title = @title
    WHERE ... -- same where clause
    AND (URL <> @URL OR title <> @title);

    换句话说,只需更新所有值,而不管哪些值实际发生了变化。

    关于sql - 每次 vs 查询覆盖值以查看值是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592211/

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