更新VARBINARY(max)列时.WRITE(NULL,NULL,NULL)的语义

krl*_*mlr 4 t-sql sql-server varbinary sql-server-2008 varbinarymax

以下查询的语义是什么?

UPDATE table
SET column .WRITE(NULL, NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

如果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]
Run Code Online (Sandbox Code Playgroud)

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

RBa*_*ung 8

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

请注意Doc中此提取的斜体部分:

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

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

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

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

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

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

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