Типы данных большого объема
В ранних версиях SQL Server работа с типами данных большого объема требовала особого подхода. Типы данных больших значений — это типы, размер которых превышает максимальный размер строки в 8 КБ. В SQL Server введен описатель max для типов данных varchar, nvarchar и varbinary, который обеспечивает хранение значений размером до 2^31 байт. Столбцы таблицы и переменные Transact-SQL могут указывать типы данных varchar(max), nvarchar(max) и varbinary(max).
В большинстве случаев работа с типами данных большого объема предполагает их извлечение из базы данных или добавление в базу данных. В следующих разделах описываются различные способы выполнения этих задач.
Извлечение типов данных большого объема из базы данных
Извлечь тип недвоичных данных большого объема, например типа данных varchar(max) из базы данных, можно путем считывания данных в виде потока символов. В следующем примере для извлечения данных из базы данных и их возвращения в виде результирующего набора используется метод executeQuery класса SQLServerStatement. Затем для считывания данных большого объема из результирующего набора используется метод getCharacterStream класса SQLServerResultSet.
Примечание
Аналогичный подход можно использовать для типов данных text, ntext и nvarchar(max) .
Извлечь тип двоичных данных большого объема, например типа данных varbinary(max) из базы данных, можно несколькими способами. Эффективнее всего считать данные в виде двоичного потока следующим образом:
Кроме того, для считывания данных в виде байтового массива можно следующим образом использовать метод getBytes:
Примечание
Также можно считать данные в виде BLOB. Однако это менее эффективно, чем два предыдущих способа.
Добавление типов данных большого объема в базу данных
Драйвер JDBC хорошо справляется с загрузкой больших объемов данных при наличии достаточного объема памяти. В противном случае рекомендуется использовать потоковую передачу. Тем не менее, эффективнее всего загружать большие объемы данных с помощью потоковых интерфейсов.
Также можно использовать передачу в виде строки или байтов следующим образом:
Примечание
Такой способ применим и для величин, хранимых в столбцах типов text, ntext и nvarchar(max) .
При наличии на сервере библиотеки изображений и при необходимости загрузки целых двоичных файлов изображений в столбец varbinary(max) эффективнее всего использовать драйвер JDBC, организуя потоки напрямую следующим образом:
Примечание
Методы CLOB и BLOB для загрузки больших объемов данных неэффективны.
Изменение типов данных большого объема в базе данных
В большинстве случаев для обновления или изменения больших значений в базе данных рекомендуется передавать параметры через классы SQLServerPreparedStatement и SQLServerCallableStatement с помощью таких команд Transact-SQL, как , , а также .
Если нужно заменить экземпляр слова в крупном текстовом файле, например в архивном HTML-файле, можно воспользоваться объектом Clob следующим образом:
Кроме того, можно выполнить все операции на сервере и просто передать параметры в подготовленную инструкцию UPDATE.
Дополнительные сведения о типах данных большого объема ищите в разделе «Использование типов данных большого объема» электронной документации по Microsoft SQL Server.
Расширенная проверка Transact-SQL
Важно!
Функция расширенной проверки Transact-SQL будет удалена из следующей версии SQL Server Data Tools и следующей основной версии Visual Studio.
Расширенная проверка Transact-SQL — это средство системы проекта базы данных, которое позволяет разработчикам передавать свои проекты базы данных в службу Transact-SQL Compiler Service во время сборки для проверки их кода с помощью синтаксического анализатора и интерпретатора ядра SQL Server.
Служба Transact-SQL Compiler Service
Служба Transact-SQL — это компонент, основанный на ядре СУБД Microsoft SQL Server 2012. Эта служба позволяет проверять синтаксис и семантику инструкций DDL с той же достоверностью, что и ядро СУБД Microsoft SQL Server 2012. Это автоматически означает, что служба компилятора не поддерживает синтаксические конструкции или функции, которые стали устаревшими в Microsoft SQL Server 2012. Дополнительные сведения об устаревших функциях см. в разделе Неподдерживаемые функциональные возможности ядра СУБД в SQL Server 2012.
В целях проверки проекта базы данных служба Compiler Service создает частично автономную базу данных и имитирует выполнение инструкций DDL применительно к этой базе данных. Дополнительные сведения см. в разделе Частично автономные базы данных.
На службу Compiler Service распространяются ограничения двух категорий.
Средства, которые зависят от конфигурации базы данных или экземпляра, включая следующие:
-
ссылки на трех- или четырехкомпонентные объекты
-
Таблицы FileTable
-
Отслеживание изменений
-
Функции набора строк — OPENROWSET, OPENQUERY, OPENDATASOURCE
-
Полнотекстовый семантический поиск
Средства, которые в настоящее время не поддерживаются для проверки, включая следующие:
-
Компонент Service Broker
-
Секционированные схемы с определяемыми пользователем группами FileGroups
-
Параметры сортировки метаданных SQL Azure (в службах Compiler Service используются параметры сортировки метаданных частично автономных баз данных SQL Server 2012 — Latin1_General_100_CI_AS_KS_WS_SC)
Включение и отключение расширенной проверки
Расширенная проверка Transact-SQL включена по умолчанию в проекте базы данных, который создан непосредственно из Базы данных SQL Azure, или в проекте, для которого в качестве целевой платформы задана SQL Azure. Рекомендуется использовать расширенную проверку при разработке для SQL Azure или при создании базы данных уровня приложения, предназначенной для SQL Server 2012. Дополнительные сведения о базах данных уровня приложения см. в разделе Частично автономные базы данных.
Функцию расширенной проверки можно также использовать при разработке базы данных уровня приложения для SQL Server 2008/R2 в целях достижения совместимости с Microsoft SQL Server 2012 и SQL Azure.
Включение или отключение расширенной проверки на уровне проекта
-
В обозревателе решений щелкните правой кнопкой мыши файл проекта и выберите Свойства.
-
В окне Параметры проекта, в разделе Целевая платформа установите или снимите флажок Включить расширенную проверку Transact-SQL для общих объектов.
Включение расширенной проверки на уровне файлов
-
Дважды щелкните правой кнопкой мыши SQL-файл в обозревателе решений.
Примечание
Чтобы отключить средства расширенной проверки Transact-SQL на уровне файлов, задайте для свойства Действие сборки значение Сборка.
-
В окне Свойства измените значение свойства Расширенная проверка T-SQL на False.
Дополнительные сведения о параметрах сортировки в частично автономных базах данных см. в разделе Параметры сортировки в автономной базе данных.
Пространственные типы данных
Пространнственные данные — это данные, определяющие географические расположения и формы, преимущественно на Земле. Это могут быть ориентиры, дороги и даже расположение фирмы. В SQL Server 2008 есть географические (geography) и геометрические (geometry) типы данных для работы с этой информацией.
Тип данных geography работает с инфорацией для шарообразной земли. Модель шарообразной земли использует при расчетах кривизну земной поверхности. Информация о положении задается широтой и долготой. Эта модель хорошо годится для приложений, связанных с морскими перевозками, военным планированием и краткосрочными приложениями, имеющими привязку к земной поверхности. Эту модель нужно использовать, если данные хранятся в виде широт и долгот.
Тип данных geometry работает с планарной моделью или моделью плоской земли. В этой модели земля считается плоской проекцией из определенной точки. Модель плоской земли не принимает в расчет кривизну поверхности земли, поэтому используется, в первую очередь, для описания коротких расстояний, например, в базе данных приложения, описывающего внутреннюю часть строения.
Типы geography и geometry создаются из векторных объектов, заданных в форматах Well-Known Text (WKT) или Well-Known Binary (WKB). Это форматы для перенесения пространственных данных, описанные в простых функциях открытого геопространственного консорциума (Open Geospatial Consortium (OGC) Simple Features) для спецификаций SQL (SQL Specification). На рис. 10 перечислены семь типов векторных объектов, поддерживаемых SQL Server 2008.
Рис. 10 Vector objects supported by SQL Server 2008
Объект | Описание |
Point | Расположение. |
MultiPoint | Набор расположений. |
LineString | Набор из нуля или более точек, соединенных линиями. |
MultiLineString | Набор прямых (linestring). |
Polygon | Непрерывная область, описываемая набором закрытых прямых (linestring). |
MultiPolygon | Набор многоугольников (polygon). |
GeometryCollection | Собрание типов geometry. |
Чтобы создать тип geography с одним или несколькими векторными объектами, сперва надо объявить тип geography в своем сценарии T-SQL, как на рис. 11. Затем нужно вызвать один из методов с рис. 12 и передать строку символов своего векторного объекта и идентификатор пространственного отношения (Spatial Reference ID) (SRID). SRID — это система идентификации пространственного отношения, созданная европейской группой нефтепоисковых исследований (European Petroleum Survey Group). Это часть набора стандартов, разработанных для картографии, геодезии и хранения геодезических данных. Каждый SRID задает для географических расчетов определенный тип эллипсоида
Это важно, потому что земля — не идеальная сфера. SQL Server 2008 может выполнять расчеты только на идентичных SRID
Рис. 12 Construct objects for geography and geometry
Метод | Описание |
STGeomFromText | Создает элементы geography из текста на вводе. |
STPointFromText | Создает элемент geography Point из текста на вводе. |
STMPointFromText | Создает элемент geography MultiPoint из текста на вводе. |
STLineFromText | Создает элемент geography LineString из текста на вводе. |
STMLineFromText | Создает элемент geography MultiLineString из текста на вводе. |
STPolyFromText | Создает элемент geography Polygon из текста на вводе. |
STMPolyFromText | Создает элемент geography MultiPolygon из текста на вводе. |
STGeomCollFromText | Создает элемент geography GeometryCollection из текста на вводе. |
Рис. 11 Create points, lines, and polygon geometry
DECLARE @geo1 geometrySELECT @geo1 = geometry::STGeomFromText('POINT (3 4)', 0)PRINT @geo1.ToString()
DECLARE @geo2 geometrySELECT @geo2 = geometry::Parse(‘POINT(3 4 7 2.5)’)PRINT @geo2.STX;PRINT @geo2.STY;PRINT @geo2.Z;PRINT @geo2.M;
DECLARE @geo3 geography;SELECT @geo3 = geography::STGeomFromText( ‘LINESTRING(47.656 -122.360, 47.656 -122.343)’, 4326);SELECT @geo3.ToString();
—Results—POINT (3 4)—3—4—7—2.5
DECLARE @gx geometry; SET @gx = geometry::STPolyFromText( ‘POLYGON ((5 5, 10 5, 10 10, 5 5))’, 0);PRINT @gx.ToString();—Results—POLYGON ((5 5, 10 5, 10 10, 5 5))
Различия между geography и geometry
Типы данных geography и geometry созданы для работы с различными видами данных, поэтому следует знать о некоторых ключевые отличиях между ними. В типе данных geometry, расстояния и площади задаются в тех же единицах измерения, что и координаты объектов. Например, расстояние между точками (0,0) и (6,8) всегда будет 10 единиц. В типа geography иначе, он использует эллиптические координаты, выражающиеся в градусах широты и долготы.
Если координаты выражены парами широты и долготы, тип данных GEOMETRY возвращает некорректные результаты. Следующий код T-SQL расчитывает расстояние между POINTS (точками) (90 0) и (90 180). Обе они находятся на северном полюсе, поэтмоу расстояние должно быть равным 0. В случае GEOMETRY расчетное расстояние оказывается 180.
DECLARE @g1 GEOMETRY, @g2 GEOMETRY, @g3 GEOGRAPHY, @g4 GEOGRAPHYSELECT @g1 = GEOMETRY::STGeomFromText('POINT (90 0)', 0)SELECT @g2 = GEOMETRY::STGeomFromText('POINT (90 180)', 0)
SELECT @g3 = GEOGRAPHY::STGeomFromText(‘POINT (90 0)’, 4326)SELECT @g4 = GEOGRAPHY::STGeomFromText(‘POINT (90 180)’, 4326)SELECT @g2.STDistance(@g1) AS ‘GEOMETRY’, @g4.STDistance(@g3) AS ‘GEOGRAPHY’;
—Results—GEOMETRY GEOGRAPHY———————— ————————180 0
Ориентация пространственных данных для этих типов данных тоже различается. В планарной системе, используемой типом данных geometry, ориентация многоугольника не является важным фактором. Например, многоугольник с координатами ((0, 0), (10, 0), (0, 20), (0, 0)) — то же самое, что и многоугольник ((0, 0), (0, 20), (10, 0), (0, 0)). Напротив, тип данных geography использует модель, в которой необходимо определять ориентацию многоугольника. Возьмем, например, кольцо вдоль экватора. Относится ли многоугольник, описываемый этим кольцом, к северному или южному полушарию? Это значит, что при работе с данными geography, ориентация и расположение должны описываться точно.
Есть и дополнительные ограничения, накладываемые SQL Server 2008 на тип данных geography. Например, каждый элемент должен попадать в одно полушарие. Большие пространственные объекты недопустимы и вызовут ArgumentException. Типы данных geography, требующие двух вводов, возвращают NULL, если результаты методов не попадают в одно полушарие.
В SQL Server есть несколько методов, позволяющих выполнять операции с объектами geography и geometry. На рис. 13 показаны некоторые примеры использования методов работы с пространственными данными в SQL Server 2008. Я не могу в ограниченном объеме статьи рассказать об этом подробнее, но вы сможете найти полные описания в SQL Server Books Online.
Рис. 13 Working with spatial data
DECLARE @gm geometry;DECLARE @gg geography;DECLARE @h geography;
SET @gm = geometry::STGeomFromText(‘POLYGON((0 0, 13 0, 3 3, 0 13, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))’, 0);SELECT @gm.STArea();
—Results—38
SET @gg = geography::STGeomFromText(‘LINESTRING(0 0, 5 5)’, 4326);—Calculate the distance to a point slightly offset from the LINESTRING.SET @h = geography::STGeomFromText(‘POINT(4 4)’, 4326);SELECT @gg.STDistance(@h);
—Results— 430.182777043046
—Calculate the distance to a point on the LINESTRING.SET @h = geography::STGeomFromText(‘POINT(5 5)’, 4326);SELECT @gg.STDistance(@h);
—Results— 0
DECLARE @temp table ( varchar(10), geography);
INSERT INTO @temp values (‘Point’, geography::STGeomFromText(‘POINT(5 10)’, 4326));INSERT INTO @temp values (‘LineString’, geography::STGeomFromText(‘LINESTRING(13 5, 50 25)’, 4326));—Calculate the distance to a point on the LINESTRING.—Display the number of dimensions for a geography object stored in a —table variable.INSERT INTO @temp values (‘Polygon’, geography::STGeomFromText(‘POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))’, 4326));
SELECT , .STDimension() as FROM @temp;
—Results—name dim———— ————-Point 0—LineString 1—Polygon 2
Надеюсь, что эта информация о семи новых типах данных в SQL Server 2008 принесла пользу.
Ссылки по теме
Объекты репликации
Максимальные значения для различных объектов, определяемых в Репликации SQL Server.
SQL Server Объект Replication | Максимальные значения для SQL Server(64-разрядная версия) | Дополнительные сведения |
---|---|---|
Статей (публикация слиянием) | 2048 | |
Статей (моментальный снимок или публикация транзакций) | 32 767 | |
Столбцов в таблице (публикация слиянием) | 246 | Если для обнаружения конфликтов применяется трассировка на уровне строк (по умолчанию), базовая таблица может содержать не более 1 024 столбцов, однако столбцы из статьи должны быть отфильтрованы, чтобы было опубликовано не более 246 столбцов. Если применяется трассировка на уровне столбцов, базовая таблица может содержать не более 246 столбцов. |
Столбцов в таблице (моментальный снимок или публикация транзакций SQL Server) | 1000 | Базовая таблица может включать максимальное количество столбцов, разрешенное в базе данных публикации SQL Server (1024), но столбцы должны быть отфильтрованы из статьи, если они превышают максимальное количество, заданное для данного типа публикации. |
Столбцов в таблице (моментальный снимок или публикация транзакций Oracle) | 995 | Базовая таблица может включать максимальное количество столбцов, разрешенное в базе данных публикации SQL Server (1024), но столбцы должны быть отфильтрованы из статьи, если они превышают максимальное количество, заданное для данного типа публикации. |
Байтов на столбец, используемый в фильтре строк (публикация слиянием) | 1024 | |
Байтов на столбец, используемый в фильтре строк (моментальный снимок или публикация транзакций) | 8000 |
Извлечение данных даты и времени
В следующей таблице описаны методы, используемые для получения значений даты и времени SQL Server 2008.
Метод SqlClient | Описание |
---|---|
GetDateTime | Извлекает значение указанного столбца в виде структуры DateTime. |
GetDateTimeOffset | Извлекает значение указанного столбца в виде структуры DateTimeOffset. |
GetProviderSpecificFieldType | Возвращает для поля тип, являющийся базовым типом конкретного поставщика. Возвращает для новых типов даты и времени те же типы, что и . |
GetProviderSpecificValue | Возвращает значение указанного столбца. Возвращает для новых типов даты и времени те же типы, что и . |
GetProviderSpecificValues | Извлекает значения в указанном массиве. |
GetSqlString | Извлекает значение столбца как тип SqlString. InvalidCastException возникает, если данные нельзя выразить в виде . |
GetSqlValue | Извлекает данные столбца в качестве по умолчанию. Возвращает для новых типов даты и времени те же типы, что и . |
GetSqlValues | Извлекает значения в указанном массиве. |
GetString | Возвращает значение столбца в виде строки, если Type System Version имеет значение SQL Server 2005. InvalidCastException возникает, если данные нельзя выразить в качестве строки. |
GetTimeSpan | Извлекает значение указанного столбца в виде структуры TimeSpan. |
GetValue | Извлекает значение указанного столбца в виде базового типа CLR. |
GetValues | Извлекает значения столбцов в массиве. |
GetSchemaTable | Возвращает класс DataTable, описывающий метаданные результирующего набора. |
Примечание
Новые дата и время не поддерживаются для кода, выполняющегося в процессе на SQL Server. Если один из этих типов будет передан на сервер, возникнет исключение.
Функции ODBC, поддерживающие определяемые пользователем типы больших данных CLR
В этом разделе обсуждаются изменения в функциях ODBC собственного клиента SQL Server, касающиеся поддержки определяемых пользователем типов больших данных CLR.
SQLBindCol
Значения столбцов результатов определяемого пользователем типа преобразуются из типов данных SQL в C, как описано в разделе «Привязки и преобразования» выше в этом разделе.
SQLBindParameter
Для определяемых пользователем типов необходимы следующие значения.
Тип данных SQL | Тип параметра | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (длина не более 8 000 байт) | SQL_SS_UDT | n | |
SQL_SS_UDT (длина более 8 000 байт) | SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) |
SQLColAttribute
Значения, возвращаемые для определяемых пользователем типов, описаны в подразделе «Поля дескрипторов для результатов» ранее в этом разделе.
SQLColumns
Значения, возвращаемые для определяемых пользователем типов, описаны в подразделе «Метаданные столбца, возвращаемые функциями SQLColumns и SQLProcedureColumns (метаданные каталога)» ранее в этом разделе.
SQLDescribeCol
Для определяемых пользователем типов возвращаются следующие значения.
Тип данных SQL | DataTypePtr | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (длина не более 8 000 байт) | SQL_SS_UDT | n | |
SQL_SS_UDT (длина более 8 000 байт) | SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) |
SQLDescribeParam
Для определяемых пользователем типов возвращаются следующие значения.
Тип данных SQL | DataTypePtr | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (длина не более 8 000 байт) | SQL_SS_UDT | n | |
SQL_SS_UDT (длина более 8 000 байт) | SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) |
SQLFetch
Значения результирующих столбцов определяемых пользователем типов преобразуются из типов данных SQL в C, как описано в разделе «Привязки и преобразования» ранее в этом разделе.
Значения результирующих столбцов определяемых пользователем типов преобразуются из типов данных SQL в C, как описано в разделе «Привязки и преобразования» ранее в этом разделе.
SQLGetData
Значения результирующих столбцов определяемых пользователем типов преобразуются из типов данных SQL в C, как описано в разделе «Привязки и преобразования» ранее в этом разделе.
SQLGetDescField
Поля дескрипторов, доступные с новыми типами, описаны в подразделах «Поля дескрипторов для параметров» и «Поля дескрипторов для результатов» ранее в этом разделе.
SQLGetDescRec
Для определяемых пользователем типов возвращаются следующие значения.
Тип данных SQL | Тип | Подтип | Длина | Точность | Масштабирование |
---|---|---|---|---|---|
SQL_SS_UDT (длина не более 8 000 байт) | SQL_SS_UDT | n | n | ||
SQL_SS_UDT (длина более 8 000 байт) | SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) | SQL_SS_LENGTH_UNLIMITED (0) |
SQLGetTypeInfo
Значения, возвращаемые для определяемых пользователем типов, описаны в подразделе «Метаданные, возвращаемые функциями SQLColumns и SQLProcedureColumns (метаданные каталога)» ранее в этом разделе.
SQLProcedureColumns
Значения, возвращаемые для определяемых пользователем типов, описаны в подразделе «Метаданные, возвращаемые функциями SQLColumns и SQLProcedureColumns (метаданные каталога)» ранее в этом разделе.
SQLPutData
Значения параметров определяемого пользователем типа преобразуются из C в типы данных SQL, как описано в разделе «Привязки и преобразования» ранее в этом разделе.
SQLSetDescField
Поля дескрипторов, доступные с новыми типами, описаны в подразделах «Поля дескрипторов для параметров» и «Поля дескрипторов для результатов» ранее в этом разделе.
SQLSetDescRec
Для определяемых пользователем типов разрешены следующие значения.
Тип данных SQL | Тип | Подтип | Длина | Точность | Масштабирование |
---|---|---|---|---|---|
SQL_SS_UDT (длина не более 8 000 байт) | SQL_SS_UDT | n | n | ||
SQL_SS_UDT (длина более 8 000 байт) | SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) | SQL_SS_LENGTH_UNLIMITED (0) |
SQLSpecialColumns
Значения, возвращаемые для столбцов DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH и DECIMAL_DIGTS определяемых пользователем типов, описаны в подразделе «Метаданные, возвращаемые функциями SQLColumns и SQLProcedureColumns (метаданные каталога)» ранее в этом разделе.
SQLCLR и сборка SQLCLR
На страницах свойств SQLCLR и сборки SQLCLR имеется множество параметров, относящихся к использованию объектов SQL CLR в конкретном проекте. В частности, на странице свойств SQLCLR имеется настройка уровня разрешений, которая определяет разрешения для сборки SQLCLR. На ней также находится параметр «Формировать DDL», указывающий, должен ли формироваться код языка DDL для объектов SQLCLR, добавленных к проекту. Страница свойств сборки SQLCLR содержит все параметры компилятора, которые можно задать для настройки компиляции кода SQLCLR в проекте.
На странице свойств сборки SQLCLR содержатся дополнительные параметры сборки для построения объектов SQL CLR. Различные параметры предоставляются в зависимости от языка (VB или C#), используемого для создания объектов SQL CLR.
-
Если объект написан на языке C#, то для доступа к параметрам нужно нажать кнопку Дополнительно на странице свойств сборки SQLCLR. Описание параметров C# см. в статье Диалоговое окно «Дополнительные параметры компилятора» (C#).
-
Если объект построен с использованием VB, можно сперва выбрать VB в раскрывающемся списке Язык , а затем нажать кнопку Дополнительно . Описания параметров для Visual Basic см. в статье Диалоговое окно «Дополнительные параметры компилятора» (Visual Basic).