以下查询的语义是什么
UPDATE table
SET column .WRITE(NULL, NULL, NULL)
如果column
属于VARBINARY(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找到证据。我是否忽略了某些事情,或者这种无操作行为是否可能改变?
答案 0 :(得分:8)
实际上,仔细阅读与(here)链接的文档逻辑上意味着.WRITE(NULL,NULL,NULL)
应该尝试将列截断为已经存在的长度。 I.E.,实际上是无操作。
请注意Doc:
中此提取的斜体部分<强>
.WRITE (expression,@Offset,@Length)
强>指定的一部分 要修改column_name的值。表达式取代了@Length 从column_name的@Offset开始的单位。 ...
expression
:是复制到的值 列名。 ... 如果expression设置为NULL,则@Length为 忽略,并且column_name中的值在指定时被截断 @Offset 的。
@Offset
:是column_name at值的起点 写了哪个表达式。 ... 如果@Offset为NULL,则为 更新操作在现有的末尾附加表达式 column_name值和@Length被忽略。 ...
因此,如果@Offset
为NULL,则将其视为列的当前长度。
并且,如果expression
为NULL,则列将被@Offset
值截断。
Ergo,如果两者都为NULL,则列将以其当前长度截断。我认为这意味着它实际上什么都不做。