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

时间:2013-05-19 21:18:27

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

以下查询的语义是什么

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找到证据。我是否忽略了某些事情,或者这种无操作行为是否可能改变?

1 个答案:

答案 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,则列将以其当前长度截断。我认为这意味着它实际上什么都不做。

相关问题