4

以下查询的语义是什么

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

ifcolumnVARBINARY(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. 但是,我似乎无法在文档中找到证据。我是否忽略了某些事情,或者这种无操作行为可能会改变?

4

1 回答 1

8

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

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

.WRITE (expression,@Offset,@Length)

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

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

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

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

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

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

于 2013-05-29T19:18:13.817 回答