Главная » Microsoft SQL Server, Базы данных » Скалярные функции

0

Скалярная функция возвращает одно значение. Обычно скалярные функции используются в выражениях столбцов инструкции SELECT, в предложениях WHERE и коде T-SQL. SQL Server содержит десятки встроенных функций (рис. 8.2); в этом разделе будут описаны только те из них, которые я считаю наиболее полезными.

Puc. 8.2. Просмотреть все доступные функции SQL Server лучше всего в окне Object Explorer

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

В SQL Server 2005 можно создавать три типа пользовательских функций. Более подробно мы поговорим об этом в главе 22.

Информационные функции

В архитектуре “клиент/сервер” полезно знать, кем является конкретный клиент. В этом смысле очень полезными окажутся следующие четыре функции, особенно при сборе информации для аудита.

?               User_name (). Возвращает имя текущего клиента, каким он представился базе данных. Когда пользователю открыт доступ к базе данных, его имя может отличаться от регистрационного имени входа на сервер.

?               Suser_sname (). Возвращает регистрационное имя пользователя, под которым он вошел на SQL Server. Даже если тот был аутентифицирован как член одной из групп пользователей Windows, функция все равно возвращает имя его учетной записи Windows.

?               Host_name (). Возвращает имя рабочей станции пользователя.

?               Арр_паше (). Возвращает имя приложения, подключенного к SQL Server.

Рассмотрим пример:

SELECT

USER_NAME() AS ‘User’,

SUSER_SNAME() AS ‘Login’,

HOST_NAME() AS ‘Workstation’,

APP_NAME() AS ‘Application’

Результат будет следующим:

User Login                         Workstation Application

dbo                                                                     NOLI\Paul CHA2 NOLI       SQL Query Analyzer

Функции работы с датой и временем

Базы данных часто работают с датой и временем, и SQL Server содержит для работы с ними ряд полезных функций. SQL Server хранит дату и время в одном типе данных.

Две функции Т-SQL возвращают текущие дату и время.

?               Get Date (). Возвращает текущие серверные дату и время, округленные до ближайших трех миллисекунд.

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

Следующие четыре функции извлекают определенную часть значения с типом данных date time и работают с ним.

Дополнительная Подробная информация о datetime и других типах данных содержится в гла- информация ве 17.

?               DateNam е {фрагмент, дата). Возвращает правильное имя заданного фрагмента значения datetime (фрагменты для функций datename () и datepart () приведены в табл. 8.2).

SELECT DATENAME(Year, GetDate()) as Year Результат будет следующим:

Year

2001

В следующем примере для мистера Франка вводится дата рождения, а затем извлекаются правильные названия отдельных фрагментов этой даты с помощью функции datename ():

UPDATE Guide

SET DateOfBirth = ‘9/4/58′

WHERE lastName = ‘Frank’

SELECT LastName,

DATENAME(yy,DateOfBirth) AS [Year],

DATENAME(mm,DateOfBirth) AS [Month],

DATENAME(dd,DateOfBirth) AS [Day],

DATENAME(weekday, DateOfBirth) AS BirthDay FROM dbo.Guide

WHERE DateOfBirth IS NOT NULL

Результат выполнения будет следующим:

LastName Year Month                Day BirthDay

Frank                                                         1958 September 4           Thursday

Таблица 8.2. Фрагменты типа данных Datetime, используемые функциями даты и времени

Фрагмент Аббревиатура Фрагмент Аббревиатура Фрагмент Аббревиатура
Год УУ. УУУУ День dd, d Минута mi, n
Квартал qq> q Неделя wk, ww Секунда ss, s
Месяц mm, m День недели dw Миллисекунда ms
День года dy, d Час hh

?               DatePart (фрагмент, дата). Возвращает выбранный фрагмент значения типа datetime. В следующих фрагментах извлекаются день года и день недели в виде целых чисел:

SELECT DATEPART(DayofYear, GetDate()) AS DayCount Результат будет следующим:

DayCount

321

SELECT DATEPART(dw, GetDate()) AS DayWeek Результат будет следующим:

DayWeek

7

Простейший способ получить только дату, обрезав время, — это использовать несколько функций.

Select Cast (Char (10) , GetDateO, 101) as DateTime

?               DateAdd{фрагмент, величина, дата_начала) и DateDiff{фрагмент, величина, дата_начала). Выполнение сложения и вычитания с данными типа datetime, что часто требуется в базах данных. Функции datedif f () и dateadd () созданы специально для этих целей. Результат функции datedif f () не выглядит как полноценный тип date time, так как извлекается только фрагмент даты.

В следующем запросе вычисляется количество дней, которые я женат на Мелиссе: SELECT

DATEDIFF(уу,’1984/5/20′, Getdate()) AS MarriedYears,

DATEDIFF(dd,’1984/5/20′, Getdate()) AS MarriedDays

Результат будет следующим:

MarriedYears MarriedDays

17                       6390

Следующий запрос добавляет 100 часов к текущей миллисекунде:

SELECT DATEADD(hh,100, GETDATE()) AS [lOOHoursFromNow]

Результат будет следующим: lOOHoursFromNow

2006-11-21 18:42:03.507

Следующий пример основан на базе данных Family и вычисляет возраст матери на момент рождения каждого из детей с помощью функции datedif f ():

USE Family

SELECT Person.FirstName + 1 ‘ + Person.LastName AS Mother,

DATEDIFF(yy, Person.DateOfBirth,

Child.DateOfBirth) AS Age,Child.FirstName FROM Person

JOIN Person Child

ON Person.PersonID = Child.MotherlD ORDER By Age DESC

Функция datedif f в этом запросе возвращает разницу в годах между днем рождения матери и детей. Так как функция находится в выражении для столбца, она вычисляется для каждой строки в следующем наборе данных:

Mother Age FirstName
Audrey Halloway 33 Corwin
Kimberly Kidd 31 Logan
Elizabeth Campbell 31 Alexia
Melanie Campbell 30 Adam
Grace Halloway 30 James

В SQL Server не содержится тип данных только для даты, однако многим приложениям он нужен. Во избежание недоразумений обрезайте время и оставляйте только дату с помощью триггера. О триггерах речь пойдет в главе 23.

Строковые функции

Как и большинство современных языков программирования, Т-SQL содержит множество функций работы со строками.

?               substring {строка, начальная_позиция, длина). Возвращает фрагмент строки. Первым параметром является сама строка, вторым — номер символа, с которого вырезается фрагмент, третьим — длина вырезаемого фрагмента.

Например, результатом инструкции SELECT SUBSTRING (‘abcdefg’ , 3, 2) будет подстрока 1 cd’.

?               Stuff {строка, позиция_вставки, число_удаляемых_символов, вставляемая_строка). Противоположная по характеру функции substring (), функция stuff () вставляет одну строку в другую; при этом в позиции вставки может быть удалено заданное количество символов исходной строки. Например, результатом инструкции SELECT STUFF (‘ abcdefg1 , 3, 2, ‘123’) будет строка ‘abl23efg’. В следующем примере использованы вложенные функции stuff () для форматирования номера социального страхования США:

SELECT STUFF(STUFF(‘123456789′, 4, 0, ‘-‘), 7, 0, ‘-‘)

Результат будет следующим:

123-45-6789

Char Index {символ _поиска, строка, начальная_позиция). Возвращает позицию заданного символа в строке. Например, инструкция SELECT CHARINDEX(‘с 1, ‘abcdefg’, 1) вернет результат 3.

Пользовательская функция TitleCase (), описываемая далее в этом разделе, использует функцию Char Index () для обнаружения пробелов, разделяющих слова.

Patlndex. {%гиаблон%, строка). Выполняет поиск по шаблону, который может содержать в строке символы макроподстановки. В следующем примере ищется первое вхождение в строку символа с или d:

SELECT PATINDEX(‘%[cd]%’, ‘abdcdefg’)

Результатом данного запроса будет число 3.

Right {строка, число) и Left {строка, число). Возвращает крайнюю правую или левую часть строки. Например, результатом запроса

SELECT Left(‘Nielsen’,2) AS ‘[Left]’,

RIGHT(‘Nielsen’,2) AS [Right]

будет

Left Right Ni en

Len {строка). Функция возвращает длину строки. Например, инструкция SELECT LEN(‘Supercalifragilisticexpialidocious’) AS Len вернет результат Len

34

Rtrim {строка) и Ltrim {строка). Эти функции удаляют соответственно пробелы в начале и в конце строки. Несмотря на то что это можно не заметить на печатном листе, для иллюстрации работы функции мы удалим по три начальных и завершающих пробела:

SELECT RTRIM(‘ middle earth ‘) AS [RTrim],

LTRIM(‘ middle earth ‘) AS [LTrim]

Результат будет следующим:

RTrim          LTrim

middle earth middle earth

Upper {строка) и Lower {строка). Преобразует целую строку в верхний или нижний регистр. Символы нижнего регистра впервые использовались в IX веке для имитации рукописного письма. С появлением печатного станка в XV веке печатники вручную устанавливали регистры символов на каждой странице. Они хранили буквы в ящиках над печатной матрицей. Выше располагались ящики с большими символами. По этой причине и возникли термины верхний регистр и нижний регистр. А вот как использовать описываемые функции:

Select UPPER(‘one TWO tHrEe1) as [Uppercase],

LOWER(‘one TWO tHrEe’) as [Lowercase]

Uppercase       Lowercase

ONE TWO THREE one two three

?               Replace {строка, строка). Эта функция оперирует со строкой в целом и производит в ней замены. При использовании функции replace () в инструкции update можно легко исправить ошибки в данных, например удалить лишние символы табуляции или скорректировать шаблоны строк. В следующем примере удаляются апострофы в столбце LastName (фамилия) таблицы Contact базы данных OBXKites:

USE OBXKites

UPDATE Contact

SET LastName = ‘Adam”s’

WHERE LastName = ‘Adams’

SELECT LastName, REPLACE(LastName, ”’1, ”)

FROM Contact WHERE LastName LIKE UPDATE Contact

SET LastName = REPLACE(LastName, ””, ”)

WHERE LastName LIKE ‘%?’%’

При работе со строковыми константами довольно тяжело вставить кавычку в На заметку строку, не завершив ее или не вызвав синтаксическую ошибку. В SQL Server эта проблема решается с помощью двух последовательных символов кавычек, которые затем преобразуются в одну. Например, константа ‘ Паб о’ ‘ Брайене’ будет сохранена как Паб О’Брайене.

?               pTitleCasе. {источник, приемник, замена). В языке Т-SQL отсутствует функция, преобразующая слова в титульный формат (первая буква каждого слова всегда имеет верхний регистр, а все остальные — нижний). Следующая пользовательская функция способна справиться с этой задачей:

CREATE FUNCTION pTitleCase (

@StrIn NVARCHAR(1024))

RETURNS NVARCHAR(1024)

AS

BEGIN

DECLARE

@StrOut NVARCHAR(1024),

@CurrentPosition INT,

@NextSpace INT,

@CurrentWord NVARCHAR(1024),

@StrLen INT,

@LastWord BIT SET @NextSpace = 1 SET @CurrentPosition = 1 SET @StrOut = ”

SET @StrLen = LEN(@StrIn)

SET @LastWord = 0 WHILE @LastWord = 0 BEGIN

SET @NextSpace =

CHARINDEX(‘ ‘,@StrIn, @CurrentPosition+ 1)

IF @NextSpace = 0 — no more spaces found BEGIN

SET @NextSpace = @StrLen SET ©LastWord = 1

END

SET @CurrentWord =

UPPER(SUBSTRING(@StrIn, @CurrentPosition, 1))

SET @CurrentWord = @CurrentWord +

LOWER(SUBSTRING(@StrIn, @CurrentPosition+lf @NextSpace – @CurrentPosition))

SET @StrOut = @StrOut +@CurrentWord SET @CurrentPosition = @NextSpace + 1 END

RETURN @StrOut END

Запуск любой пользовательской функции требует включения в ее вызов имени владельца:

Select dbo.pTitleCase(‘one TWO tHrEe1) as [TitleCase]

Результат будет следующим:

TitleCase

One Two Three

Функция pTitleCase не принимает во внимание возможность нестандартного сочетания строчных и прописных букв, как, например, в фамилиях McDonald, VanCamp или de Jonge. Вряд ли было бы целесообразным учитывать весь список таких исключений. Возможно, было бы лучшим решением хранить в обновляемом списке приставки, формирующие нестандартные фамилии (Van, de, Мс и т.п.). Обновленную функцию вы сможете найти на сайте www.isnotnull.com; если хотите, можете внести в нее дополнительные улучшения.

Текст функции pTitleCase можно загрузить с сайта книги по адресу www. SQLServerBible.com.

Функции системы Soundex

Система поиска фонетических соответствий Soundex была создана в Америке для задач переписи населения. Президент Рузвельт потребовал от Бюро архивов США создать метод каталогизации населения, который учел бы всевозможные вариации одинаковых фамилий. Система Soundex была создана Маргарет Оделл и Робертом Расселом, на что были получены патенты 1261167 (1918 г.) и 1435663 (1922 г.). Далее карточки переписи населения заполнялись с использованием этого метода.

Целью метода Soundex является такая сортировка, чтобы похоже звучащие имена находились рядом, что очень полезно при работе с информацией о контактах в приложениях базах данных. Например, если я звоню в банк и диктую свою фамилию Нильсон, то оператор вполне может услышать ее как Нильсен и занести в таком виде в форму базы данных. Однако если в базе данных используется система Soundex, то моя фамилия все равно появится в списке результатов поиска.

Более подробно о системе Soundex и ее истории вы можете узнать на следующих Web- сайтах:

www.nara.gov/genealogy/coding.html

www.amberskyline.com/treasuremaps/uscensus.html

http://www.blueproof.com/soundex

А вот как работает эта система. Первая буква имени хранится в виде символа, а следующие три фонетических звука хранятся по следующей схеме:

1               — В, F, Р, V

2               — С, G, J, К, Q, S, X, Z

3               — D, Т

4               —L

5               — М, N

6               —R

Двойные буквы А, Е, I, О, U, Н, W, Y и некоторые предлоги в одном коде Soundex во внимание не принимаются. Таким образом, моя фамилия Nilsen в этом коде принимает вид

‘N425’ ’ следующим образом.
1. Буква N сохраняется.
2. Буквы i и е игнорируются.
3. Буква 1 кодируется цифрой 4.
4. Буква s кодируется цифрой 2.
5. Буква е игнорируется.
6. Буква п сохраняется под кодом 5.

Таким образом, избавившись от фонетически сходных звуков, фамилии Nielsen, Nelson и Neilson будут иметь один и тот же код — N425.

Позвольте привести еще ряд примеров кодировки фамилий.

?               Brown — В650 (г — 6, п — 5).

?               Jeffers — J162 (ff— 1, г — 6, s — 2)

?               Letterman — L365 (tt — 3, г — 6, m — 5)

?               Nelson —N425 (1 —4, s —2, n —5)

?               Nicholson — N242 (c — 2,1 — 4, s — 2)

?               Nichols — N242 (c — 2,1 — 4, s — 2)

Использование функции soundex ()

SQL Server содержит две функции, связанные с системой Soundex: soundex () и difference (). Функция soundex (строка) вычисляет код Soundex строки. Приведем пример:

SELECT SOUNDEX(‘Nielsen’) AS Nielsen,

SOUNDEX(‘Nelson’) AS NELSON,

SOUNDEX(‘Neilson’) AS NEILSON

Результат этого запроса будет следующим:

Nielsen NELSON NEILSON

N425 N425 N425

Существует еще один, более совершенный метод кодировки Soundex. Кен Хен- На заметку дерсон в своей книге The Guru’s Guide to Transact SQL (Addison-Wesley, 2000) предложил улучшенный алгоритм кодировки и соответствующую хранимую процедуру. Если вы собираетесь внедрять метод Soundex в производственной среде, я бы рекомендовал воспользоваться его версией. При желании вы можете поискать и другие алгоритмы на вышеперечисленных Web-сайтах и написать свою хранимую процедуру.

Существуют два способа внедрения поиска Soundex в базу данных. Простейший из них заключается во вставке функции soundex () в предложение WHERE, например:

USE СНА2

SELECT LastName, FirstName FROM dbo.Customer

WHERE SOUNDEX(‘Nikolsen’) = SOUNDEX(LastName)

Результат будет следующим:

LastName  FirstName

Nicholson  Charles

Nickols      Bob

Несмотря на то что такая реализация имеет небольшое влияние на схему данных, она приводит к снижению производительности благодаря увеличению объема обрабатываемых данных, так как функция soundex () обрабатывает каждую строку в базе данных. Более производительная вариация предполагает изначальную сортировку по первой букве имени и сокращение объема поиска. Это позволяет применить функцию soundex () только к строкам, выбранным индексом.

SELECT LastName, FirstName FROM dbo.Customer

WHERE SOUNDEX(‘Nikolsen’) = SOUNDEX(LastName)

AND LastName LIKE ‘N%’

Первый запрос обрабатывался 37,5 миллисекунды, в то время как усовершенствованный всего 6,5. Думаю, что на большем объеме данных разница будет более чувствительной.

Еще один метод реализации предполагает создание кластеризованного индекса по столбцу. Так как значение Soundex для каждой строки вычисляется во время записи, функцию soundex () не придется вызывать в инструкции SELECT при чтении каждой строки. Этот метод я бы порекомендовал для приложений, которые сильно зависят от метода Soundex при поиске контактов.

Именно этот метод продемонстрирован в базе данных OBXKites. Хранимая процедура pContactAddNew вычисляет код Soundex для каждого нового контакта и сохраняет результат в столбце SoundexCode. В этом случае поиск строк, основанный на сохраненном коде, выполняется экстремально быстро.

Для примера попробуем найти код Soundex для фамилии Smith.

USE OBXKites

SELECT SOUNDEX(‘Smith’)

S530

Узнав код, теперь можно выполнить поиск Soundex без вызова самой функции soundex () в инструкции SELECT.

SELECT LastName, FirstName, SoundexCode FROM Contact

WHERE SoundexCode = ‘S530′

Результат получится следующим:

LastName                                  FirstName        SoundexCode

Smith    Ulisius                         S530

Smith    Oscar                           S530

Использование функции Dif ference о

Второй функцией работы с методом Soundex в SQL Server является difference (). Она возвращает разность Soundex между двумя строками в форме числа от 1 до 4, где четверка соответствует полному совпадению кода.

USE СНА2

SELECT LastName, DIFFERENCE (‘Smith’, LastName) AS NameSearch FROM Customer

ORDER BY DIFFERENCE (‘Smyth’, LastName) DESC Результат получится следующим:

LastName                NameSearch

Smythe              4

Spade                3

Zeniod               3

Kennedy            3

Kennedy            3

Quinn                2

Kemper             1

Nicholson         0

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

Функции преобразования данных

В SQL Server преобразования одного типа данных в другой часто выполняются автоматически. Многие из них неявные или автоматические. Исключения из этого правила приведены в табл. 8.3.

Таблица 8.3. Исключения в преобразованиях типов данных
Из какого типа В какой тип Проблемы в преобразовании
binary, varbinary float, real, ntext, text Преобразование недопустимо
char, varchar, nchar, nvarchar binary, varbinary, money, smallmoney, timestamp Требуется явное преобрование
nchar, nvarchar image Преобразование недопустимо
datetime, smalldatetime decimal, numeric, float, real, bigint, int, smallint, tinyint, money, smallmoney, bit, timestamp Требуется явное преобразование
datetime, smalldatetime, decimal, numeric, float, real, bigint, int, smallint, tinyint, money, smallmoney, bit Uniqueidentifier, image, ntext, text Преобразование недопустимо
Из какого типа В какой тип Проблемы в преобразовании
decimal, numeric decimal, numeric Требуется явное указание точности во избежание потери данных
float, real timestamp Преобразование недопустимо
money, smallmoney char, varchar, nchar, nvarc7har Требуется явное преобразование
timestamp nchar, nvarchar, float, real, uniqueidentif ier, ntext, text, sql_variant Преобразование недопустимо
uniqueidentifier datetime, smalldatetime, decimal, numeric, float, real, bigint, int, smallint, tinyint, money, smallmoney, bit, timestamp, image, ntext Преобразование недопустимо
image char, varchar, nchar, nvarchar, date time, smalldatetime, decimal, numeric, float, real, bigint, int, smallint, tinyint, money, smallmoney, bit, ntext, sql_variant Преобразование недопустимо
ntext, text binary, varbinary, datetime, smalldatetime, decimal, numeric, float, real, bigint, int, smallint, tinyint, money, smallmoney, bit, timestamp,

uniqueidentif ier, image, sql_variant

Преобразование недопустимо
ntext char, varchar Необходимо явное преобразование
text nchar, nvarchar Преобразование недопустимо
sql_variant timestamp, image, ntext, text Преобразование недопустимо

Для явных преобразований используют функции cast () и convert ().

?               Cast (исходные_данные AS тип данных). Стандарт ANSI SQL рекомендует явное преобразование одного типа данных в другой. Даже если такое преобразование может быть выполнено неявно сервером, использование функции cast () гарантирует получение нужного типа.

Функция cast () программируется несколько отлично от других. Вместо разделения двух своих аргументов запятой используется ключевое слово AS, за которым следует требуемый тип данных, например:

SELECT CAST(‘Away’ AS NVARCHAR(5)) AS ‘Tom Hanks’

Результат запроса будет таким:

Тош Hanks

Away

А вот еще один пример:

SELECT CAST(123 AS NVARCHAR(15)) AS Int2String и его результат:

Int2String

123

?               Convert {тип_данных, выражение [, стиль] ). Эта функция возвращает значение, преобразованное в другой тип данных с произвольным форматированием. Эта функция не предусмотрена стандартом ANSI SQL. Первым ее аргументом является желаемый тип данных, применяемый к выражению.

Аргумент стиль предполагает применение к результату некоторого стиля. Все допустимые стили приведены в табл. 8.4. Стиль обычно применяется при преобразовании из типа даты-времени в символьный и наоборот. Как правило, одно- или двухцифровой стиль предполагает двухцифровой год, а трехцифровой — четырехцифровой год. К примеру, стиль 1 подразумевает следующий формат данных: 01/01/03, в тоже время стиль 3 — 01/01/2003. Стили, отмеченные в таблице звездочкой, являются исключением из этого правила.

SQL Server также предлагает числовые стили форматирования, однако это больше относится к интерфейсу пользователя, чем к самой базе данных.

Таблица 8.4. Стили дат функции convert ()
Стиль Описание Формат
0/100* Используется по умолчанию ммм дд гггг чч:миАМ (или РМ)
1/101 США мм/дд/гг
2/102 ANSI гг.мм.дд
3/103 Великобритания, Франция дд/мм/гг
4/104 Германия дд.мм.гг
5/105 Италия дд-мм-гг
6/106 - ДД МММ гг
7/107 - МММ дд,гг
8/108 - чч:мм:сс
9/109* По умолчанию + миллисекунды ммм дд гггг чч:мм:сс:мммАМ (или РМ)
10/110 США мм-дд-гг
11/111 Япония гг/мм/дд
12/112 ISO ггммдд
13/113 Европейский по умолчанию + миллисекунды дд ммм гггг чч:мм:сс:ммм (24 часа)
14/114 - чч:мм:сс:ммм (24 часа)
Стиль Описание Формат
20/120* ODBC канонический гггг-мм-дд чч:мм:сс (24часа)
20/121* ODBC канонический + миллисекунды гггг-мм-дд чч:мм:сс:ммм (24часа)
126 IS08601 для XML гггг-мм-дд чч:мм:сс (без пробелов)
130 Кувейт дц ммм гггг чч:мм:сс:мммАМ (или РМ)
131 Кувейт дд/мм/гг чч:мм:сс:мммАМ (или РМ)

В чистой среде “клиент/сервер” данные передаются клиенту без форматирования — этим занимается клиентское приложение в зависимости от потребностей конечного пользователя. Неформатированные данные более независимы, чем форматированные, так как могут использоваться разными приложениями.

В следующем примере проиллюстрировано использование функции convert ():

SELECT GETDATEO AS RawDate,

CONVERT (NVARCHAR(25), GETDATEO, 100) AS DatelOO,

CONVERT (NVARCHAR (25) , GETDATEO, 1) AS Datel

Результат операции следующий:

RawDate                                                          DatelOO                                                                    Datel

2001-11-17 10:27:27.413                          Nov 17 2001 10:27AM 11/17/01

Две дополнительные функции преобразуют данные между текстовым и числовым типами.

?               St г (число, длина, десятичных _знаков). Преобразует число в строку.

SELECT STR(123,5,2) AS [STR]

Результат будет следующим:

Str

123 . 0

Информация о среде сервера

Системные функции возвращают информацию текущей среде сервера. В этом разделе мы рассмотрим наиболее популярные из них.

?               Db_name (). Возвращает имя текущей базы данных, что и продемонстрировано в следующем примере:

SELECT GETDATEO AS ‘Date’,

DB_NAME() AS ‘Database’

Результат выполнения инструкции следующий:

Date                                                                                Database

2001-11-15 18:38:50.250 CHA2

?               GetUTCDate (). Возвращает текущее время часового пояса Гринвичского меридиана. Эта функция очень пригодится в приложениях, к которым обращаются из разных часовых поясов.

?               ServerProperty (). Поставляет информацию о сервере, которая может понадобиться функции serverproperty (свойство), в частности следующую:

•                 Со 11 at ion. Тип сопоставления.

•                 Edition. Редакция сервера: Enterprise, Developer и т.п.

•                 InstanceName. Имя экземпляра сервера или NULL, если используется экземпляр по умолчанию.

•                 ProductVersion. Версия SQL Server.

•                 Product Level. “RTM” — для исходной промышленной версии; “SPn” — для пакетов обновлений; “Вл” — для бета-версии.

•                 ServerName. Полное имя сервера и экземпляра.

В следующем примере с помощью этой функции мы получим редакцию ядра и уровень продукта (результат получен на моем сервере):

SELECT

SERVERPROPERTY (‘ServerName’) AS ServerName,

SERVERPROPERTY (‘Edition’) AS Edition,

SERVERPROPERTY (‘ProductLevel’) AS ProductLevel

Будет получен следующий результат:

ServerName Edition                                    ProductLevel

NOLI             Developer Edition SP1

Резюме

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

В частности, в следующей главе описывается, как запрос получает данные из нескольких источников.

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии