更新VARBINARY(max)列时,.WRITE(NULL, NULL, NULL)的语义是什么?

4
以下查询的语义是什么?
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]

执行此操作不会更改中的数据。但是,我无法在文档中找到证据。我是否忽略了某些东西,或者这种无操作行为可能会改变?


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

8
实际上,仔细阅读链接 (here) 中的文档可以逻辑地意味着 .WRITE(NULL,NULL,NULL) 应该尝试将列截断到其已有的长度。也就是说,这实际上是一个无操作。
注意此提取中的斜体部分:

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

指定要修改的 column_name 的一部分值。expression 替换从 column_name 的 @Offset 开始的 @Length 单位。...

expression: 是要复制到 column_name 的值。... 如果 expression 设置为 NULL,则忽略 @Length,并在指定的 @Offset 处截断 column_name 中的值

@Offset: 是 expression 要写入的 column_name 值的起始点。... 如果 @Offset 为 NULL,则更新操作会将 expression 追加到现有 column_name 值的末尾,并忽略 @Length。...

所以,如果@Offset为NULL,则视为列的当前长度。

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

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


所以,@Length被忽略了,因为expressionNULL而且因为@Offset也是NULL。因此,观察到的行为确实是唯一合乎逻辑的解释。我只是想知道为什么这不是明确说明的...感谢仔细分析! - krlmlr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接