【问题标题】:Semantics of .WRITE(NULL, NULL, NULL) when updating a VARBINARY(max) column更新 VARBINARY(max) 列时 .WRITE(NULL, NULL, NULL) 的语义
【发布时间】:2013-05-19 21:18:27
【问题描述】:

以下查询的语义是什么

UPDATE table
SET column .WRITE(NULL, NULL, NULL)

如果columnVARBINARY(max) 类型并且其内容不是NULL

快速测试表明查询 是无操作:

--DROP TABLE [table]
CREATE TABLE [table] ([column] VARBINARY(max))
INSERT INTO [table] VALUES (0x12345678)
UPDATE [table]
SET [column] .WRITE(NULL, NULL, NULL)
SELECT * FROM [table]

执行它不会改变column 中的数据。但是,我似乎无法在documentation 中找到证据。我是否忽略了某些事情,或者这种无操作行为可能会改变?

【问题讨论】:

  • “无操作”对您意味着什么?您的语法不正确,如您链接到的文档所示(请参阅“更新大对象数据类型”下的示例)。这对我有用:update dbo.Mytable set MyColumn.Write(null, null, null)
  • @Pondlife:谢谢,已编辑。它也适用于我,但这种行为是否记录在案?
  • 我不知道你在问什么:什么是“这种行为”?参数已记录在案,并且注释说您不能将值设置为 NULL 或使用 write 更新 NULL 列值。听起来您看到了一些您不期望或不理解的东西,但由于您没有显示任何查询结果或输出,我不确定有人能告诉您什么。如果您发布了一个完整的工作示例,该示例准确地显示了您所询问的行为,那么有人可能能够澄清它。
  • @krlmlr:实际上,您链接到的文档在逻辑上暗示.WRITE(NULL,NULL,NULL) 将尝试将列截断到它已经存在的长度。即,实际上是无操作。
  • @RBarryYoung:愿意在答案中详细说明这一点吗?我很乐意为合乎逻辑的解释奖励赏金:-)

标签: sql-server sql-server-2008 tsql varbinary varbinarymax


【解决方案1】:

实际上,仔细阅读链接到 (here) 的文档在逻辑上意味着.WRITE(NULL,NULL,NULL) 应该尝试将列截断到它已经存在的长度。即,实际上是无操作。

请注意此文档摘录中的斜体部分:

.WRITE (expression,@Offset,@Length):

指定部分 column_name 的值将被修改。表达式替换@Length 从 column_name 的 @Offset 开始的单位。 ...

expression: 是复制到的值 列名。 ... 如果表达式设置为 NULL,@Length 是 被忽略,并且 column_name 中的值在指定位置被截断 @Offset

@Offset: 是 column_name 值的起点,位于 写的是哪个表达式。 ... 如果 @Offset 为 NULL,则 更新操作将表达式附加到现有的末尾 column_name 值和@Length 被忽略。 ...

因此,如果 @Offset 为 NULL,则将其视为列的当前长度。

并且,如果 expression 为 NULL,则在 @Offset 值处截断列。

因此,如果两者都为 NULL,则该列将被截断为其当前长度。我认为这意味着它实际上什么都不做。

【讨论】:

  • 所以,@Length 被忽略,因为 expressionNULL并且 因为 @OffsetNULL。所以确实观察到的行为是唯一合乎逻辑的解释。我只是想知道为什么没有明确说明...感谢您的仔细分析!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2020-12-02
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多