Поддержка разреженных столбцов в собственном клиенте SQL Server

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

SQL Server Native Client поддерживает разреженные столбцы. Дополнительные сведения о разреженных столбцах в SQL Server см. в разделе "Использование разреженных столбцов " и "Использование наборов столбцов".

Дополнительные сведения о поддержке разреженных столбцов в собственном клиенте SQL Server см. в разделах Поддержка разреженных столбцов (ODBC) и поддержка разреженных столбцов (OLE DB).

Пользовательские сценарии для разреженных столбцов и собственный клиент SQL Server

В следующей таблице приведены общие сценарии пользователей для пользователей собственного клиента SQL Server с разреженными столбцами:

Сценарий Поведение
select * from table или IOpenRowset::OpenRowset. Возвращает все столбцы, которые не являются элементами набора разреженных столбцов column_set плюс XML-столбец, содержащий значения ненулевых столбцов, являющихся элементами набора разреженных столбцов column_set.
Ссылка на столбец по имени. На столбец можно ссылаться независимо от состояния разреженности или вхождения в column_set.
Доступ к столбцам-элементам column_set через вычисляемый XML-столбец. К столбцам, являющимся элементами column_set, можно получить доступ при помощи выборки column_set по имени; эти столбцы могут содержать значения, вставленные и обновленные при обновлении XML в столбце column_set.

Значение должно соответствовать схеме для столбцов column_set.
Получение метаданных для всех столбцов таблицы с помощью SQLColumns с помощью шаблона поиска столбцов NULL или %( ODBC); или через набор строк схемы DBSCHEMA_COLUMNS без ограничения столбца (OLE DB). Возвращает строку для всех столбцов, не входящих в column_set. Если таблица содержит разреженный column_set, для него будет возвращена строка.

Обратите внимание, что при этом не возвращаются метаданные для столбцов, являющихся элементами column_set.
Получение данных для всех столбцов, независимо от разреженности или вхождения в column_set. В этом случае может вернуться очень большое число строк. Задайте для поля дескриптора SQL_SOPT_SS_NAME_SCOPE значение SQL_SS_NAME_SCOPE_EXTENDED и вызов SQLColumns (ODBC).

Вызов IDBSchemaRowset::GetRowset для набора строк схемы DBSCHEMA_COLUMNS_EXTENDED (OLE DB).

Этот сценарий невозможен из приложения, использующего собственный клиент SQL Server из выпуска до SQL Server 2008 (10.0.x). Однако такое приложение может напрямую запрашивать системные представления.
Получение метаданных только для столбцов, являющихся элементами column_set. В этом случае может вернуться очень большое число строк. Задайте для поля дескриптора SQL_SOPT_SS_NAME_SCOPE значение SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET и вызов SQLColumns (ODBC).

Вызов IDBSchemaRowset::GetRowset для набора строк схемы DBSCHEMA_SPARSE_COLUMN_SET (OLE DB).

Этот сценарий невозможен из приложения, использующего собственный клиент SQL Server из выпуска до SQL Server 2008 (10.0.x). Однако такое приложение может запрашивать системные представления.
Определение, является ли столбец разреженным. Обратитесь к столбцу SS_IS_SPARSE результирующий набор SQLColumns (ODBC).

Обратитесь к столбцу SS_IS_SPARSE результирующего набора строк схемы DBSCHEMA_COLUMNS (ODBC).

Этот сценарий невозможен из приложения, использующего собственный клиент SQL Server из выпуска до SQL Server 2008 (10.0.x). Однако такое приложение может запрашивать системные представления.
Определение, является ли столбец элементом column_set. Обратитесь к столбцу SS_IS_COLUMN_SET результирующий набор SQLColumns. Кроме того, обратитесь к атрибуту конкретного столбца SQL Server SQL_CA_SS_IS_COLUMN_SET (ODBC).

Обратитесь к столбцу SS_IS_COLUMN_SET набора строк схемы DBSCHEMA_COLUMNS. Или просмотрите dwFlags, возвращенный IColumnsinfo::GetColumnInfo или DBCOLUMNFLAGS в наборе строк, возвращаемом IColumnsRowset::GetColumnsRowset. Для столбцов column_set будет задано DBCOLUMNFLAGS_SS_ISCOLUMNSET (OLE DB).

Этот сценарий невозможен из приложения, использующего собственный клиент SQL Server из выпуска до SQL Server 2008 (10.0.x). Однако такое приложение может запрашивать системные представления.
Импорт и экспорт разреженных столбцов программой BCP для таблиц без column_set. Изменения в поведении предыдущих версий собственного клиента SQL Server не изменяются.
Импорт и экспорт разреженных столбцов программой BCP для таблиц с column_set. column_set импортируется и экспортируется так же, как XML; то есть varbinary(max), если он привязан как двоичный тип, или как nvarchar(max), если он привязан как тип char или типа wchar.

Столбцы, являющиеся элементами набора разреженных столбцов column_set, не экспортируются как отдельные столбцы. Они экспортируются только в составе значения столбца column_set.
Поведение queryout для программы BCP. Изменения в обработке явно именованных столбцов из предыдущих версий SQL Server Native Client не изменяются.

Сценарии, задействующие импорт и экспорт между таблицами с различными схемами, могут потребовать специальной обработки.

Дополнительные сведения о программе BCP см. в подразделе «Поддержка массового копирования (BCP) для разреженных столбцов» далее в данном разделе.

Работа в клиентах низкого уровня

Клиенты низкого уровня вернут метаданные только для столбцов, которые не являются элементами набора разреженных столбцов column_set для SQLColumns и DBSCHMA_COLUMNS. Дополнительные наборы строк схемы OLE DB, представленные в SQL Server 2008 (10.0.x), не будут доступны и не будут изменяться в SQLColumns в ODBC через SQL_SOPT_SS_NAME_SCOPE.

Клиенты нижнего уровня могут получить доступ к столбцам, которые являются членами разреженных column_set по имени, и столбец column_set будет доступен в виде XML-столбца для клиентов SQL Server 2005 (9.x).

Поддержка массового копирования (BCP) для разреженных столбцов

В ODBC или OLE DB для разреженных столбцов или функций column_set нет изменений в API BCP.

Если таблица содержит column_set, то разреженные столбцы не обрабатываются как отдельные столбцы. Значения всех разреженных столбцов включаются в значение столбца column_set, который экспортируется таким же способом, как XML-столбец, то есть как varbinary(max), если привязан как двоичному типу, или как nvarchar(max), если привязан тип char или wchar). При импорте значение column_set должно соответствовать схеме column_set.

Для операций queryout нет изменений в способе обработки столбцов, на которые имеются явные ссылки. Поведение столбцов column_set совпадает с поведением XML-столбцов, и разреженность не имеет значения для обработки именованных разреженных столбцов.

Однако, если queryout используется для экспорта и пользователь ссылается по имени на разреженные столбцы, являющиеся элементами набора разреженных столбцов, нельзя осуществить импорт напрямую в таблицу такой же структуры. Это обусловлено тем, что программа BCP использует для импорта метаданные, согласованные с операцией select *, и не умеет сопоставлять столбцы-элементы column_set с этими метаданными. Для отдельного импорта каждого столбца, входящего в набор разреженных столбцов column_set, необходимо определить представление для таблицы, которая ссылается на необходимые столбцы набора column_set, и выполнить операцию импорта с помощью этого представления.

См. также

Программирование собственного клиента SQL Server