Учебник по языку sql (ddl, dml) на примере диалекта ms sql server. часть первая

Типы данных большого объема

В ранних версиях 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.

Включение или отключение расширенной проверки на уровне проекта
  1. В обозревателе решений щелкните правой кнопкой мыши файл проекта и выберите Свойства.

  2. В окне Параметры проекта, в разделе Целевая платформа установите или снимите флажок Включить расширенную проверку Transact-SQL для общих объектов.

Включение расширенной проверки на уровне файлов
  1. Дважды щелкните правой кнопкой мыши SQL-файл в обозревателе решений.

    Примечание

    Чтобы отключить средства расширенной проверки Transact-SQL на уровне файлов, задайте для свойства Действие сборки значение Сборка.

  2. В окне Свойства измените значение свойства Расширенная проверка 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 Geometry­Collection из текста на вводе.

Рис. 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.

  1. Если объект написан на языке C#, то для доступа к параметрам нужно нажать кнопку Дополнительно на странице свойств сборки SQLCLR. Описание параметров C# см. в статье Диалоговое окно «Дополнительные параметры компилятора» (C#).

  2. Если объект построен с использованием VB, можно сперва выбрать VB в раскрывающемся списке Язык , а затем нажать кнопку Дополнительно . Описания параметров для Visual Basic см. в статье Диалоговое окно «Дополнительные параметры компилятора» (Visual Basic).

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: