Для определения того, задан ли интересующий нас бит, можно использовать битовую операцию «И» (&), тогда конечный вариант будет выглядеть следующим образом:
IF Permissions (object_id('production.product'))&1=1
SELECT 'Есть право выборки'
ELSE
SELECT 'Права выборки нет'
Рис. 2.3. Результат функции Permissions для вывода текстового описания
Вместо оператора SELECT можно воспользоваться оператором PRINT, который просто позволяет выводить данные в виде текста, а не в виде таблицы, как это делает SELECT. Тогда код будет выглядеть так:
IF Permissions (object_id('production.product'))&1=1
PRINT 'Есть право выборки'
ELSE
PRINT 'Права выборки нет'
А результат будет выведен не на вкладку Results, а на вкладку Messages (рис. 2.4).
Рис. 2.4. Результат использования PRINT
Задание 3. Вывести имя компьютера, на котором выполняется команда. Если имя компьютера более девяти букв, то вывести только первые шесть букв.
Указания к выполнению: Для получения имени компьютера используется функция HOST_NAME().
Для определения длины строки можно воспользоваться функцией DataLength.
Пример выполнения задания:
IF (DATALENGTH(HOST_NAME()) / 2 > 9)
SELECT LEFT(HOST_Name(), 6) + '...'
ELSE
SELECT HOST_Name()
Замечание. Обратите внимание, что результат функции DATALENGTH мы разделили на два. Это обусловлено тем, что HOST_NAME() возвращает тип nvarchar, в котором под каждый символ отводится два байта.
Задание 4. Посчитать количество цифр в числе.
Указания к выполнению: Один из возможных вариантов решения данной задачи (см. рис.2.5):
DECLARE @num int, @cnt int
SET @num = 19
IF (@num = 0) SET @cnt = 1
ELSE BEGIN
SET @cnt = 0
WHILE (@num <> 0) BEGIN
SET @cnt = @cnt + 1
SET @num = @num / 10
END
END
SELECT @cnt AS 'Количество цифр'
Рис. 2.5. Результат работы кода
Самостоятельная работа
Оптимизировать код решения задания 4: избавиться от условного оператора, должен остаться только цикл WHILE, при этом код должен по-прежнему работать как для нуля и положительных чисел, так и для отрицательных.
Определить, имеет ли пользователь право доступа к полю 'CardNumber', таблицы CreditCard в базе данных AdventureWorks2008. Если доступ есть, то вывести «Доступ есть», иначе – «В доступе отказано».
Написать программу пересчета веса из фунтов в килограммы (1 фунт равняется 453,6 г). Результат должен быть выведен следующим образом, например:
3.3 фунт(а/ов) – это 1 кг 496 г.
Вывести информацию о текущих именах сервера, учетной записи и пользователя базы данных в следующем виде:
Вы вошли на сервер User400-01\SQL2008 как User400-01\User with dbo permissions.
Определить количество часов и минут, прошедших со времени запуска служб MS SQL Server.
Определить величину оплаты за отправку телеграммы. Признаком завершения телеграммы является точка. Стоимость одного слова 33 коп, результат вывести с указанием количества рублей и копеек. Строка может содержать произвольное число пробелов.
Используя шифр Цезаря, зашифруйте заданную строку текста. Идея данного метода шифрования – алфавит размещается как бы по часовой стрелке. Для шифровки буквы текста заменяются буквами, отстоящими на заданное число букв (сдвиг) по часовой стрелке.
Известна фамилия, имя и отчество пользователя. Найти число его личности. Правило получения числа личности: каждой букве сопоставлено число – порядковый номер буквы в алфавите. Эти числа складываются, если полученная сумма не является однозначным числом, то цифры числа снова складываются и так до тех пор, пока не будет получено однозначное число.