2013-05-19 3 views
3

Что семантика следующего запросаСемантика .WRITE (NULL, NULL, NULL) при обновлении колонки (макс) VARBINARY

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. Я что-то пропустил, или это поведение не-op может измениться?

+0

Что означает «нет-op» для вас? Ваш синтаксис неверен, так как связанная с ним документация (см. Примеры в разделе «Обновление типов данных больших объектов»). Это работает для меня: 'update dbo.Mytable set MyColumn.Write (null, null, null)' – Pondlife

+0

@Pondlife: Спасибо, отредактирован. Это работает и для меня, но это поведение задокументировано? – krlmlr

+0

Я не знаю, о чем вы спрашиваете: что такое «это поведение»? Параметры документированы, и в комментариях указано, что вы не можете установить значение NULL или обновить значение столбца NULL, используя 'write'.Похоже, вы видите то, чего не ожидаете или не понимаете, но поскольку вы не показывали результатов или результатов запроса, я не уверен, что кто-то может вам сказать. Если вы опубликуете полный рабочий пример, в котором точно указано поведение, о котором вы спрашиваете, кто-то может его прояснить. – Pondlife

ответ

7

На самом деле тщательное чтение документа, связанного с (here), логически подразумевает, что .WRITE(NULL,NULL,NULL) должен попытаться усечь колонку до той длины, которая уже есть. I.E., фактически не-op.

Обратите внимание на выделенные курсивом разделы в этой выписке из Doc:

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

Указывает, что раздел значения column_name должен быть изменен. выражение замещает @Length единиц, начинающихся с @Offset column_name. ...

expression: это значение, которое копируется в column_name. ... Если для выражения установлено значение NULL, значение @Length равно , а значение в имени_ column_ усечено с указанным @Offset.

@Offset: является отправной точкой в ​​значении column_name в который записывается выражение. ... Если @Offset равно NULL, операция обновления добавляет выражение в конец существующего значения столбца , а @Length игнорируется. ...

Так что если @Offset является NULL, тогда он обрабатывается, как если бы это была текущая длина столбца.

И, если expression NULL, столбец усекается по значению @Offset.

Ergo, если оба значения NULL, то столбец усекается на его текущей длине. Который я подразумеваю, что он эффективно ничего не делает.

+0

Итак, '@ Length' игнорируется, потому что' expression' является 'NULL', * и *, потому что' @ Offset' является 'NULL'. Таким образом, наблюдаемое поведение является единственным логическим объяснением. Мне просто интересно, почему это не указано явно ... Спасибо за тщательный анализ! – krlmlr

Смежные вопросы