【问题标题】:SQL Update table rows where the is a specific valueSQL 更新表行,其中 是特定值
【发布时间】:2020-01-24 15:03:30
【问题描述】:

我在 SQL Server 中有下表。

它被称为 ScenarioData,我使用数据特别是 fieldValue 列将此数据附加到表单中。我已经实现了这个功能,但不幸的是,表单要求的开始日期必须是现在或未来 30 天。因为一旦日期过去,我就将数据存储在数据库中,这些值是多余的。我有一个存储过程,它根据scenarioDataId 从该表中选择所有值。

我正在考虑确保日期始终有效,我可以将其添加到此存储过程中,以使用当前日期更新相关行(coverStartDateDay、coverStartDateMonth、coverStartDateYear),以便始终接受该值。

我已经执行了以下 SQL

UPDATE dbo.ScenarioData
SET ScenarioData.FieldValue = DAY(CURRENT_TIMESTAMP)
WHERE ScenarioData.FieldName = "CoverStartDateDay";

我曾希望将当前日期附加到 feilfValue 中的行,其中列 fieldName 等于值coverStartDateDay。不幸的是,我收到一条错误消息,说 CoverStartDateDay 不是一列。首先我哪里出错了,其次我怎样才能实现我想要的功能?

提前致谢

【问题讨论】:

  • 非常简单的语法错误。只需将双引号更改为单引号即可。
  • 仅供参考,这看起来是非常严重的非规范化数据。使用单独的列并使用正确的数据类型会好得多。 (n)varchar 不是“一刀切”的数据类型。
  • @Larnu 你能解释一下你所说的非规范化数据是什么意思,而且 (n)varchar 一种尺寸适合所有人。谢谢
  • 你有一个代表很多东西的列,一个开始日期,一个邮政编码,一个门牌号码,这些东西是不同的数据类型,一个date,一个int,一个varchar .每个都应该是它自己的列,具有正确的数据类型。在这种情况下,您应该建造宽而不是高。
  • 好的,我理解你的观点并且我同意它,但我可能因为没有在我有这张表的原因后面添加上下文而不好。 FeidlName 中的所有内容都是来自 html 表单的 id。我创建了使用与数据库接口的 Web API 进行 ajax 调用的 Web 扩展。因此,FieldValue 中的所有数据都代表一个 html 元素 ID。例如,使用邮政编码并导致成为“#Postcode”。然后我使用它来搜索表单并将 fieldValue 数据附加到该字段,因此数据是所有内容的混合。

标签: sql sql-server sql-update


【解决方案1】:

使用单引号:

WHERE ScenarioData.FieldName = 'CoverStartDateDay';

在 SQL Server 中,双引号被视为列名。但是,双引号有不同的用法,具体取决于QUOTED_IDENTIFIER 的设置。

默认情况下 QUOTED_IDENTIFIER 已启用 (ON) 并且您不能使用它来包含 literal 字符串。

例如,如果您想使用双引号,则需要禁用 QUOTED_IDENTIFIER

SET QUOTED_IDENTIFIER OFF

【讨论】:

  • 谢谢,这是一个如此简单的错误。你自己和 Suraji Kumar 都给了我解决这个问题的办法,所以谢谢你们俩
【解决方案2】:

试试这个 varcharstring 值应该在单引号中传递,而不是在双引号中。

UPDATE dbo.ScenarioData
SET ScenarioData.FieldValue = DAY(CURRENT_TIMESTAMP)
WHERE ScenarioData.FieldName = 'CoverStartDateDay'

双引号用于标识符。不知何故,如果你想传递包含单引号的值,那么你可以使用'',即两次单引号而不是双引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多