Программирование >>  Программирование баз данных 

1 ... 61 62 63 [ 64 ] 65 66 67 ... 346


Но если функция CONVERT не только обеспечивает осуществление всех преобразований, предусмотренных функцией CAST, но и выполняет преобразование даты, то возникает вопрос: чем обусловлена необходимость использования функции CAST? Ответ на этот вопрос является простым - совместимость со стандартом. Функция CAST совместима со стандартом ANSI, а функция CONVERT не предусмотрена стандартом ANSI.

В этом и состоит их различие. Ниже показан синтаксис вызова обеих этих функций. CAST (expression AS data type)

CONVERT(data type, expression[, style])

Очевидно, что обе эти функции по существу имеют одинаковый синтаксис, если не считать того, что в них применяется разная последовательность параметров, а при вызове функции CONVERT предусмотрена возможность задать опцию форматирования (с помощью параметра style).

Ф)Т1кции CAST и CONVERT позволяют осуществлять широкий перечень преобразований типов данньгк, которые могут потребоваться, если в СУБД SQL Sender необходимые преобразования не осуществляются неявно. Например, очень часто возникает необходимость преобразовать числовые данные в строковые. Рассмотрим следующий пример: USE AdventureWorlcs

SELECT Tlie Customer lias an Order numbered + SalesOrderlD FROM Sales.SalesOrderHeader WHERE CustomerlD = 5

Выполнение этого оператора приводит к возникновению такой ошибки: Msg 245, Level 16, State 1, Line 1

Conversion failed wlien converting tlie varchar value The Customer has an Order numbered to data type int.

Внесем корректировку в этот код, чтобы в нем вначале выполнялось преобразование числовых данных:

SELECT The Customer has an Order numbered + CAST(SalesOrderlD AS varchar) FROM Sales.SalesOrderHeader WHERE CustomerlD = 5

После этого будет получен требуемый результат:

The Customer has an Order numbered 47436 The Customer has an Order numbered 48374 The Customer has an Order numbered 49534 The Customer has an Order numbered 50746 The Customer has an Order numbered 536 07 The Customer has an Order numbered 59014 The Customer has an Order numbered 65307 The Customer has an Order numbered 71890

(8 row(s) affected)

Кроме того, с помощью функции CAST можно обеспечить преобразование дат. Рассмотрим в качестве примера следующий запрос:

SELECT OrderDate, CAST(OrderDate AS varchar) AS Converted FROM Sales.SalesOrderHeader WHERE SalesOrderlD = 43660



2001-07-01 00:00:00.000 Jul 1 2001 12:00AM (1 row(s) affected)

В данном случае заслуживает внимания то, что преобразование даты выполняется так, как предусмотрено в функции CAST; такой контроль над форматированием, который предоставляет функция CONVERT, отсутствует. А пример применения последней функции приведен ниже.

SELECT OrderDate, CONVERT(varchar(12), OrderDate, 111) AS Converted FROM Sales.SalesOrderHeader WHERE SalesOrderlD = 43660

Выполнение этого оператора приводит к получению следующих результатов: OrderDate Converted

2001-07-01 00:00:00.000 2001/07/01 (1 row(s) affected)

Очевидно, что эти результаты весьма отличаются от тех, которые получены с помощью функции CAST. А в действительности мы могли бы преобразовать эту дату в любой из нескольких форматов с двух- или четырехзначным обозначением года.

От пользователя требуется лишь указать код в качестве последнего параметра функции CONVERT (в предьщущем примере был задан код 111, соответствующий японскому стандарту, с четырехзначным обозначением года). Все коды, превышающие 100, обусловливают применение четырехзначного обозначения года, а все коды меньше 100, за несколькими исключениями, соответствуют двухзначному обозначению года. Перечень всех доступных форматов можно найти в документации Books Online под заголовком CONVERT or CASE.

Cjiedyem учитывать, что предусмотрена возможность задавать точку разбиения, которая будет использоваться в СУБД SQL Server для опредепения того, следует ли добавлять спереди к двухзначному обозначению значение 20 или 19. По умолчанию используется точка разбиения 49/50. В связи с этим двухзначное обозначение года, равное 49 или меньше, будет преобразовываться путем добавления спереди цифр 20. К любому другому обозначению года, превышающему это число, будут добавляться цифры 19. Указанное значение точки разбиения можно изменить, вызвав на выполнение процедуру sp configure или проведя корректировку конфигурации сервера базы данных с помощью программы Management Studio.

Использование внешних вызовов для выполнения сложных действий

В процессе экспл)атации СЪД SQL Ser\er нужно всегда быть готовым к тому, что может потребоваться получение информации, источник которой находится вне базы данных. Но фактически в подавляющем большинстве инсталляций получение такой информации непосредственно из СУБД SQL Server было невозможным. Вместо этого.

Этот оператор позволяет получить требуемый результат: OrderDate Converted



как правило, примен51лся компонент клиентского или промежуточного уровня, с помощью которого осуществлялась выборка требуемых данных, с одной стороны, из СУБД SQL Server, и с другой, из внешнего источника.

Такая организация работы имела свои преимущества, поскольку при выполнении внешних вызовов непосредственно с помощью сервера базы данных могло произойти зависание, которое в лучшем случае является весьма опасным, а в худшем приводит к полному прекращению работы. Дело в том, что продолжительность выполнения внешнего вызова остается неопределенной (и даже не гарантируется нормальное завершение такого вызова). В результате этого риск зависания процессов, связанных с функционированием сервера базы данных, становится довольно высоким.

Тем не менее со временем были разработаны методы безопасного получения доступа к внешним источникам данных, которые все же не получили достаточно широкого распространения. Кратко рассмотрим некоторые из предложенных методов дост)Т1а.

Прежде всего была предпринята попытка применения расширенных хранимых процедур. Расширенные хранимые процедуры представляют собой модули, хранимые в библиотеке DLL, которые могут быть разработаны на языке С; для этого используются специальные библиотеки SQL Server. Хранимые процедуры выполняются в виде одного из процессов СУБД SQL Server и могут показывать очень высокое быстродействие (при том условии, что к разработке модулей библиотеки DLL будут привлечены . достаточно опытные программисты). Но и в этом случае остается непреодоленным указанный выше недостаток, связанный с использованием внешних вызовов. Иными словами, по-прежнему приходится рассчитывать лишь на то, что вызываемый внешний процесс своевременно возвратит управление вызывающему процессу СУБД SQL Server. Кроме того, возникает еще одна проблема, обусловленная снижением общего уровня безотказности СУБД. Выполнение расширенных хранимых процедур осуществляется в виде одного из процессов СУБД SQL Server, поэтому в случае аварийного завершения этого процесса происходит также останов сервера SQL Server (последствия такого останова являются особенно неприятными, если он вызван нарушением в работе программного обеспечения, полученного от сторонней организации). Последним, но не менее важным недостатком подхода, основанного на использовании хранимых процедур, является то, что лишь очень немногие программисты обладают достаточной квалификацией для их написания.

Еще одно решение было реализовано в составе программных средств СУБД SQL Server на основе технологии OLE/COM. В одной из версий SQL Server было введено семейство хранимых процедур sp CreateOAMethod, которые позволяют создавать объекты СОМ и осуществлять их вызовы. Объекты OLE/СОМ обмениваются данными, представленными с помощью такого типа данных, как Variant, и всегда эксплуатируются вне основного процесса сервера. Этот подход характеризовался более высокой безотказностью по сравнению с хранимыми процедурами, но сами программные средства, создаваемые на его основе, в лучшем случае были весьма громоздкими и характеризовались крайне низким быстродействием.

Это положение коренным образом изменилось с тех пор, как появилась инфраструктура .NET и в СУБД SQL Server была предусмотрена возможность использовать языки CLR. Современная версия SQL Server позволяет писать сценарии с использованием любого языка .NET и создавать любые объекты, необходимые для выполнения поставленной задачи. Для вызова внешних процессов можно создавать пользовательские функции, обеспечивающие перекрестное взаимодействие с любыми другими оперативными системами, с которыми невозможно установить непосредственную



1 ... 61 62 63 [ 64 ] 65 66 67 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика