В SQL Server 2012 появилась функция , позволяющая добавлять пустые столбцы NOT в существующую таблицу (с ограничением по умолчанию). Это позволяло добавлять ненулевые столбцы в очень большие таблицы..
Это ограничено выпуском Enterprise Edition и функционально эквивалентными номерами SKU, поэтому вы видите это только в некоторых случаях в своем тестировании.
Принцип работы состоит в том, что существующие строки остаются NULL
пока не произойдет следующее касание, и значение не будет получено из метаданных.
С самими метаданными все в порядке, и их можно проверить с помощью
SELECT pc.default_value
FROM tempdb.sys.system_internals_partitions p
JOIN tempdb.sys.system_internals_partition_columns pc
ON p.partition_id = pc.partition_id
WHERE p.object_id = OBJECT_ID('tempdb..#test')
AND default_value IS NOT NULL;
Но когда значения считываются, изменяется на 0x00
случается.
Интересно - если вы измените значение по умолчанию на 0x00000000000000000000000000000001
, тогда все строки будут обновлены с правильным значением:
id testvarbinary
1 0x00000000000000000000000000000001
2 0x00000000000000000000000000000001
3 0x00000000000000000000000000000001
4 0x00000000000000000000000000000001
Одним из возможных способов решения этой проблемы было бы сделать ограничение по умолчанию недетерминированный (и невозможный кешировать как постоянная времени выполнения), чтобы предотвратить добавление онлайн-столбцаХотя в этом случае вы теряете преимущества в производительности этой функции.
Следующее выражение ограничения по умолчанию позволяет избежать проблемы
DEFAULT 0x00000000000000000000000000000000 + CAST(LEFT(NEWID(),0) AS varbinary(1))
Вы должны сообщить об этом как об ошибке на сайте uservoice .