Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В таблицах, использующих разреженные столбцы, можно назначить набор столбцов, который будет возвращать все разреженные столбцы в таблице. Набор столбцов — это нетипизированное XML-представление, которое объединяет на выходе все разреженные столбцы таблицы в структурированном виде. Набор столбцов похож на вычисляемые столбцы тем, что набор столбцов физически не хранится в таблице. Набор столбцов отличается от вычисляемого столбца тем, что он может быть напрямую обновлен.
Наборы столбцов следует использовать в том случае, если в таблице существует большое число столбцов и работать с ними по отдельности неудобно. У приложений может возрасти производительность, если они будут выбирать и вставлять данные в таблицы, имеющие много столбцов, с помощью наборов столбцов. Однако производительность наборов столбцов может уменьшиться, если для столбцов в таблице было определено большое количество индексов. Это происходит из-за увеличения объема памяти, необходимого для плана выполнения.
Чтобы определить набор столбцов, используйте <ключевые слова column_set_name> FOR ALL_SPARSE_COLUMNS в инструкцияхCREATE TABLE или ALTER TABLE .
Рекомендации по использованию наборов столбцов
При использовании наборов столбцов следует учитывать следующие рекомендации.
Разреженные столбцы и набор столбцов могут быть созданы в рамках одной и той же инструкции.
Невозможно изменить набор столбцов. Чтобы изменить набор столбцов, необходимо удалить и повторно создать набор столбцов.
Набор столбцов не может быть добавлен в таблицу, если в ней уже содержатся разреженные столбцы.
Набор столбцов может быть добавлен в таблицу, если в ней нет разреженных столбцов. Если впоследствии в таблицу будут добавлены разреженные столбцы, они появятся в наборе столбцов.
В таблице может содержаться только один набор столбцов.
Набор столбцов является дополнительной функцией, он не требуется для использования разреженных столбцов.
Для набора столбцов нельзя определить ограничения или значения по умолчанию.
Вычисляемые столбцы не могут содержать столбцы набора столбцов.
Распределенные запросы не поддерживаются в таблицах, содержащих наборы столбцов.
Репликация не поддерживает наборы столбцов.
Система отслеживания измененных данных не поддерживает наборы столбцов.
Набор столбцов не может быть частью никакого вида индексов. Это касается XML-индексов, полнотекстовых индексов и индексированных представлений. Набор столбцов не может быть добавлен как включенный столбец в любой индекс.
Набор столбцов не может использоваться в выражении фильтрации индекса или фильтруемой статистики.
Если представление содержит набор столбцов, в представлении он будет отображен как XML-столбец.
Набор столбцов не может быть включен в определение индексированного представления.
Секционированные представления, включающие таблицы, в которых содержатся наборы столбцов, могут быть обновлены, если секционированные представления упоминают разреженные столбцы по именам. Секционированное представление не может быть обновлено, если оно ссылается на набор столбцов.
Не допускается использование уведомлений о запросах, ссылающихся на наборы столбцов.
Предел размера XML-данных — 2 ГБ. Если объединенные данные всех ненулевых разреженных столбцов в строке превышают это ограничение, операция запроса или DML приведет к ошибке.
Сведения о данных, возвращаемых функцией COLUMNS_UPDATED, см. в разделе "Использование разреженных столбцов".
Рекомендации по выбору данных из набора столбцов
Следует учитывать следующие рекомендации при выборе данных из набора столбцов.
Фактически, набор столбцов — это тип обновляемого, вычисляемого XML-столбца, в котором набор базовых реляционных столбцов собирается в единое XML-представление. Набор столбцов поддерживает только свойство ALL_SPARSE_COLUMNS. Это свойство используется для агрегирования всех ненулевых значений из всех разреженных столбцов для конкретной строки.
В редакторе таблиц SQL Server Management Studio наборы столбцов отображаются в виде редактируемого XML-поля. Наборы столбцов определяются с помощью следующего формата:
<column_name_1>value1</column_name_1><column_name_2>value2</column_name_2>...Далее приводятся примеры значений набора столбцов:
<sparseProp1>10</sparseProp1><sparseProp3>20</sparseProp3><DocTitle>Bicycle Parts List</DocTitle><Region>West</Region>
Разреженные столбцы, содержащие значения NULL, не включаются в XML-представление набора столбцов.
Предупреждение
Добавление набора столбцов изменяет поведение запросов SELECT * . Запрос будет возвращать набор столбцов как XML-столбец, а не как отдельные разреженные столбцы. Разработчики схем и приложений должны учитывать это, чтобы не нарушить работу существующих приложений.
Вставка или изменение данных в наборе столбцов
Управлять данными в разреженных столбцах можно с помощью имен индивидуальных столбцов либо ссылаясь на имя набора столбцов и указывая значения набора столбцов, используя XML-формат набора столбцов. Разреженные столбцы могут быть расположены в XML-столбце в любом порядке.
При вставке или обновлении разреженных значений столбцов с помощью набора XML-столбцов значения, вставляемые в базовые разреженные столбцы, неявно преобразуются из xml типа данных. В случае числовых столбцов пустое значение в XML-файле для числового столбца преобразуется в пустую строку. Это приводит к вставке нуля в числовой столбец, как показано в следующем примере.
CREATE TABLE t (i int SPARSE, cs xml column_set FOR ALL_SPARSE_COLUMNS);
GO
INSERT t(cs) VALUES ('<i/>');
GO
SELECT i FROM t;
GO
В этом примере для столбца iне было указано значение, однако было вставлено значение 0 .
Использование типа данных sql_variant
Тип sql_variant даты может хранить несколько различных типов данных, таких как int, charи date. Наборы столбцов выводят сведения о типе данных, такие как масштаб, точность и настройка локали, которые связаны со значением sql_variant и представлены в качестве атрибутов в созданном XML-столбце. Если нужно предоставить эти атрибуты в сформированной пользователем XML-инструкции в качестве входных данных для операции вставки или обновления в наборе столбцов, то некоторые из этих атрибутов будут обязательными, а для некоторых других атрибутов будут назначены значения по умолчанию. В следующей таблице перечисляются типы данных и значения по умолчанию, которые формирует сервер, если значения предоставлены не были.
| Тип данных | localeID* | ОпцииСравненияSQL | Версия SQL-сопоставления | SqlSortId | Максимальная длина | Точность | Шкала |
|---|---|---|---|---|---|---|---|
char, varchar, binary |
-1 | По умолчанию | 0 | 0 | 8 000 | Неприменимо** | Неприменимо |
nvarchar |
-1 | По умолчанию | 0 | 0 | 4000 | Неприменимо | Неприменимо |
decimal, float, real |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | 18 | 0 |
integer, bigint, tinyint, smallint |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо |
datetime2 |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | 7 |
datetime offset |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | 7 |
datetime, date, smalldatetime |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо |
money, smallmoney |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо |
time |
Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | Неприменимо | 7 |
* localeID -1 означает локаль по умолчанию. Локаль английского языка имеет идентификатор 1033.
** Неприменимо — во время операции выбора из набора столбцов нет никаких выходных значений для этих атрибутов. Ошибка создаётся, если вызывающий указал значение для этого атрибута в представленном XML-наборе столбцов для операции вставки или обновления.
Безопасность
Модель безопасности набора столбцов работает схожим образом с моделью безопасности между таблицами и столбцами. Наборы столбцов можно визуализировать как мини-таблицу, и операция выбора похожа на операцию SELECT * в этой мини-таблице. Однако связь между набором столбцов и разреженными столбцами — это группирующая связь, а не просто контейнерная. Модель безопасности проверяет безопасность столбца в наборе столбцов и учитывает операции DENY над базовыми разреженными столбцами. Далее приводятся дополнительные характеристики модели безопасности.
Права доступа могут быть предоставлены и отменены на столбец в наборе столбцов так же, как и на любой другой столбец в таблице.
Инструкции GRANT или REVOKE для разрешений на SELECT, INSERT, UPDATE, DELETE и REFERENCES для столбца в составе набора столбцов не распространяются на составляющие его отдельные базовые столбцы. Оно применяется только к столбцу в наборе столбцов. Разрешение DENY для набора столбцов распространяется на базовые разреженные столбцы таблицы.
Чтобы выполнять инструкции SELECT, INSERT, UPDATE и DELETE над столбцом, представляющим набор столбцов, пользователь должен иметь соответствующие разрешения на этот столбец, а также соответствующие разрешения на все разреженные столбцы в таблице. Поскольку набор столбцов представляет все разреженные столбцы в таблице, пользователь должен обладать разрешением на все разреженные столбцы, включая и те, которые не будут изменены.
Выполнение инструкции REVOKE над разреженным столбцом или набором столбцов устанавливает для него параметры безопасности, заданные по умолчанию для его родительского объекта.
Примеры
В следующих примерах в таблице документа содержится обычный набор столбцов DocID и Title. Производственной группе необходимы столбцы ProductionSpecification и ProductionLocation для всех рабочих документов. Группе сбыта необходим столбец MarketingSurveyGroup для документов сбыта.
А. Создание таблицы с набором столбцов
В следующем примере создается таблица, в которой используются разреженные столбцы и содержится набор столбцов SpecialPurposeColumns. В этом примере в таблицу вставляются две строки, а затем из таблицы выбираются данные.
Замечание
Эта таблица насчитывает лишь пять столбцов, что упрощает ее отображение и чтение.
USE AdventureWorks2012;
GO
CREATE TABLE DocumentStoreWithColumnSet
(DocID int PRIMARY KEY,
Title varchar(200) NOT NULL,
ProductionSpecification varchar(20) SPARSE NULL,
ProductionLocation smallint SPARSE NULL,
MarketingSurveyGroup varchar(20) SPARSE NULL,
MarketingProgramID int SPARSE NULL,
SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS);
GO
В. Вставка данных в таблицу с помощью имен разреженных столбцов
В следующих примерах вставьте две строки в таблицу, созданную в примере A. В примерах используются имена разреженных столбцов и не ссылайтесь на набор столбцов.
INSERT DocumentStoreWithColumnSet (DocID, Title, ProductionSpecification, ProductionLocation)
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27);
GO
INSERT DocumentStoreWithColumnSet (DocID, Title, MarketingSurveyGroup)
VALUES (2, 'Survey 2142', 'Men 25 - 35');
GO
С. Вставка данных в таблицу с помощью имени набора столбцов
В следующем примере в таблицу, созданную в примере А, вставляется третья строка. В этот раз имена разреженных столбцов не используются. Вместо этого используется имя набора столбцов, а операция вставки предоставляет значения для двух из четырех разреженных столбцов в формате XML.
INSERT DocumentStoreWithColumnSet (DocID, Title, SpecialPurposeColumns)
VALUES (3, 'Tire Spec 2', '<ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>');
GO
Д. Наблюдение за результатами набора столбцов при использовании SELECT *
В следующем примере из таблицы, содержащей набор столбцов, выбираются все столбцы. Возвращается XML-столбец, содержащий сочетание значений разреженных столбцов. Она не возвращает разреженные столбцы по отдельности.
SELECT DocID, Title, SpecialPurposeColumns FROM DocumentStoreWithColumnSet ;
Результирующий набор:
DocID Title SpecialPurposeColumns
1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>
2 Survey 2142 <MarketingSurveyGroup>Men 25 - 35</MarketingSurveyGroup>
3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>
Е. Наблюдение за результатами выбора столбца по имени
Поскольку производственному отделу не нужны маркетинговые данные, в этом примере для ограничения выходных данных добавляется предложение WHERE . В этом примере используется имя набора столбцов.
SELECT DocID, Title, SpecialPurposeColumns
FROM DocumentStoreWithColumnSet
WHERE ProductionSpecification IS NOT NULL ;
Результирующий набор:
DocID Title SpecialPurposeColumns
1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>
3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>
F. Наблюдение за результатами выбора разреженных столбцов по имени
Несмотря на то, что таблица содержит набор столбцов, можно выполнять запросы из таблицы с использованием имен отдельных столбцов. Это показано в следующем примере.
SELECT DocID, Title, ProductionSpecification, ProductionLocation
FROM DocumentStoreWithColumnSet
WHERE ProductionSpecification IS NOT NULL ;
Результирующий набор:
DocID Title ProductionSpecification ProductionLocation
1 Tire Spec 1 AXZZ217 27
3 Tire Spec 2 AXW9R411 38
G. Обновление таблицы с помощью набора столбцов
В следующем примере третья запись обновляется новыми значениями для обоих разреженных столбцов, использующихся в этой строке.
UPDATE DocumentStoreWithColumnSet
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification><ProductionLocation>38</ProductionLocation>'
WHERE DocID = 3 ;
GO
Это важно
Инструкция UPDATE, использующая набор столбцов, обновляет все разреженные столбцы в таблице. Разреженные столбцы, на которые не ссылается ссылка, обновляются до NULL.
В следующем примере обновляется третья запись, однако значение указывается только для одного из двух заполненных столбцов. Второй столбец ProductionLocation не включен в инструкцию UPDATE и обновляется до NULL.
UPDATE DocumentStoreWithColumnSet
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification>'
WHERE DocID = 3 ;
GO