Программирование на SQL | Языки T-SQL, C#

В этом разделе сайта попытаемся разобраться с программированием баз данных. Язык называется SQL. В этом языке нет или почти нет классов, переменных, массивов и циклов. Сравнивать его с языками высокого уровня не имеет смысла. Но без него Вы не сможете написать интерфейс для настольных приложений Windows или интернет сайтов. Для Разработчика надо обязательно надо знать SQL, библиотеки обработки данных на C#, Microsoft Visual Studio, Microsoft SQL Server Management Studio или dbForge Studio for SQL Server

Отправка html письма через SQL Server

Существующие методы отправки писем позволяют отправить письмо в виде текста или html. Гораздо приятнее получить сообщение в котором есть текст, оформленный в виде таблицы. Его читать удобнее, например, если пришел счет. С дугой стороны, отправка таких писем требует от вас знание html разметки и стилей письма. Без них создать такой сообщение достаточно сложно. Особое внимание обратите на тэги html: table,border,h2,tr,td,br Заранее изучите их назначение. Вот пример отправки письма на основе скрипта SQL Server.

Ещё...

Создание Email аккаунта для SQL Server

Отправка почты с использованием SQL Server редко используется специалистами, т.к. существует много способов отправить почту используя языки высокого уровня, например, C#. Они позволяют проверить текст письма на ошибки, отобразить их на экране и только потом отправить письмо. SQL Server не обладает WInForm интерфейсом. Но иногда бывает нужно отправить такое письмо администратору, например, из триггера таблицы, после того, какие-то данные изменили базу данных (ордера, ошибки, заказы и т.п.). Рассмотри как это можно сделать

Для начала нужно создать Аккаунт для отправки письма. Вот пример.

Ещё...

Задание 6. Дополнительное решение заданий 1-5

На этом этапе проверяется ваша способность мыслить не стандартно. А суть вот в чем.

Прошу предоставить после решения основных заданий решение с возможностью масштабирования по количеству металлов. Необходимо внести изменения во все необходимые объекты из заданий таким образом, чтобы система легко вместо четырех металлов (NiCuPtPd), еще держала пару сотен металлов сверху. Тестирования этого предоставлять не нужно, для себя только убедитесь, что решение рабочее. Хочется увидеть именно мысль решения. Но скрипты для необходимых изменений предоставьте.

Ещё...

Задание 5. Создать хранимую процедуру

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

Входные параметры :

  • период бурения  (даты от-до),
  • код месторождения

Выход :

Кол-во проб по элементам в каждом классе содержания за выбранный период бурения  по месторождению (пустые классы не вывод��ть, использовать связь со справочником классов). Выходной результат должен быть пронумерован, классы отсортированы по возрастанию. Результат  процедуры выводится только на экран  в SQL Server Management Studio, сохранять в какую-либо таблицу  НЕ НАДО! Без использования временных таблиц!

Пример выходных данных.

Номер по порядку   Класс        Кол-во проб Ni   Кол-во проб Cu   Кол-во проб Pt   Кол-во проб Pd  
1                   0.00005-0.001         3                               4                                8                   0
2                   0.005-0.01               3                               0                                8                   0
3                   0.5-1                        0                               0                                8                   0
4                   1-10                         0                               0                                1                   1

 (предоставить скрипт создания процедуры, пример использования : входные данные , результат)

Ещё...

Задание 4. Создать таблицу результатов химических анализов

Это задание тоже относится к одной и той же теме, работы со скважинами

Поля таблицы следующие

  • Код скважины (должен обязательно присутствовать в таблице описания скважины)
  • Глубина (число до двух знаков после запятой, не может быть больше фактической глубины скважины из таблицы описания, проверять в триггере при вводе и редактировании)
  • содержание Ni (null или 0.00001-100%, число до 5 знаков после запятой)
  • содержание Cu (null или 0.00001-100%, число до 5 знаков после запятой)
  • содержание Pt (null или 0.00001-100%, число до 5 знаков после запятой)
  • содержание Pd (null или 0.00001-100%, число до 5 знаков после запятой)

Примечание. Первые два поля уникальны, т.е. для одной скважины может быть несколько глубин с разными результатами анализов. (предоставить скрипт создания таблицы, триггера  и заполнения)

Ещё...

Задание 3. Создать таблицу классов содержаний химических элементов

Это третье задание из 6 предложенных ранее для тестирования знаний по Miccosoft SQL Server. Кажется, что оно самое простое. Но от его решения будет зависеть в дальнейшем решение SP процедуры

Таблица должна содержать следующие классы содержаний (min – max, формат хранения данных выбираете самостоятельно ):

  • 0.00005-0.001
  • 0.001-0.005
  • 0.005 – 0.01
  • 0.01 -0.5
  • 0.5- 1
  • 1-10
  • 10-50
  • 50-100

(предоставить скрипт создания таблицы и заполнения)

Ещё...

Задание 2. Создать таблицу описания скважин

Если Вы разобрались с 1 заданием, то в этом задании тоже будет создавать таблица, но с некоторыми другим параметрами. В решение пропущено часть кода и доработать код вы должные его сами. Это сделано для того, чтобы вы научились программировать, а не просто читать sql код

Создаем таблицу Описания скважин. Список полей для данной таблицы

  • Код скважины (уникальное текстовое, до 20 символов)
  • Код месторождения (связать со справочником месторождений)
  • Дата начала бурения скважины ( не ранее 1950 и не позднее текущего года, по умолчанию: текущая дата)
  • Дата окончания бурения скважины ( не ранее 1950 и не позднее текущего года)
  • Глубина скважины фактическая (положительное число до двух знаков после запятой, не более 2000 метров)

Примечание. Формат поля Кода скважины: ББ-0000бббб (необязательные: 2 заглавных русских буквы и тире,  обязательные:  4 цифры,  далее любые строчные буквы и цифры). Например:  ОМ-0023бис, 0023, 0023бис, М-0023клин1

Алгоритм проверки кода реализовать в отдельной функции. В триггере при вводе и редактировании проверять формат скважины, если не подходит, то по возможности  корректировать. Например: 8 -> 0008,  80бис -> 0080бис, с-80->С-0080,СС80->СС-0080, С80->С-0080.

В остальных случаях – сообщение об ошибке, операцию отменять (предоставить скрипт создания таблицы, триггера)  Заполнить таблицу  произвольными данными (предоставить скрипт с командами ввода данных)

Ещё...

Задание 1. Создать таблицу справочник месторождений

Примеры, начинающиеся со слова Задание, пригодятся вам для проверки знаний на основе Microsoft SQL Server. Это нужно, например, для прохождения тестов на вакансию, связанную с программированием T-SQL Server. Срок выполнения таких задач не может быть более 1-2 дней. Иначе интерес к вам как специалисту будет потерян. 

Вам предлагается создать таблицу справочник месторождений. 

  • Код месторождения (целый числовой)
  • Широта (десятичные градусы, -pi/2 >= широта <= pi/2)
  • Долгота (десятичные градусы, 0 >= долгота <= 2*pi)
  • Зона (целый числовой, вычисляемые поле, Зона = div(Долгота/6) + 1)
  • Наименование месторождения (уникальное текстовое, до 50 знаков)
  • Система координат (Талнахская, Норильская; необязательное поле, предусмотреть возможность добавление новых систем координат)
  • Дата ввода \ обновления
  • Компьютер пользователя, выполнившего операцию

Примечание. Последние 2 поля должны обновляться в триггере с использованием системных функций (предоставить скрипт создания таблицы, триггера).  Заполнить таблицу данными (предоставить скрипт с командами ввода данных)

Ещё...

Оптимизация sp-процедур SQL Server

Попробуем разобраться, как можно оптимизировать сложные процедуры SQL Server. История возникновения таких процедур, как всегда безобидна и  начинается с создания таблиц, потом простых SELECT запросов и т.д. Все это нормально работает. Но проходит немного времени, но иногда месяцев, кто-то начинает их модернизировать и улучшать, добавляя новый функционал, множество параметров. Получается много строк кода 400-500 и более, все это начинает медленно работает и раздражать пользователей. И так пришло время, и вы начинаете все это анализировать и пытаетесь понять, почему все это так медленно работает.

Анализ таблиц

С чего начать анализ процедуры. Конечно, с полей таблиц, с чего ранее и началась разработка SP процедуры. Для этого находим в процедуре таблицы и открываем их для анализа в Microsoft SQL Server Management Studio (MSSMS). Обращаем внимание на следующее

  • Есть поле Country в таблице Customers, но у него нет значения, а в самой процедуре стоит  проверка  типа ISNULL(Country,"")=="". Логики в этом коде никакой. Это нужно тогда, когда выводится группа данных, а NULL поле мешает связывать текстовые поля. Решение. Задаем значение по умолчанию пробел или "-", а потом удаляем проверку на NULL из процедуры. Скорость увеличится, причем значительно. P.S. Мне приходилось встречать десятки таких проверок на 1 процедуру. Конечно, в этом случае надо посмотреть на интерфейс, как он отреагирует на эти изменения. 
  • Есть поле Country, но кто-то сделал заполнение поля через скалярную функции (которая включает в себя SQL запрос), т.е. Country вычисляется, а не является полем хранения данных. Другой программист сделал запрос SELECT TOP 100 * FROM Customers и добавил его в SP процедуру. На экране MSSMS он получит свой результат, но то, что SQL Server сделает еще 100 запросов он не узнает. Решение. 1 вариант. Лучше не использовать в полях таблиц скалярные функции с SELECT запросами. С другой стороны, если этого не избежать в нашем случае, то можно объединить через JOIN таблицы клиентов и стран. 2 вариант, просто указать вместо *, нужные поля без Country, если логика SP процедуры это позволяет Ещё...

Программирование на SQL

Не будем засорять этот раздел разными простыми задачами, нам нужны необычные идеи. Вот, например, такая задача. Она встречается в банках, где стек разработки на SQL достигает 90%. На разработку дается максимум 24 часа (т.е. есть время и другими делами позаниматься). Мне удалось ее решить вечером часа за 3, успев сделать и некоторые домашние дела.

Но это не все, задача не имеет типового решения, всегда есть еще и другие способы. Подумайте над этим. Даю описание.

Задача - написать запрос, выводящий средний остаток из таблицы на заданный период. Для проверки результата вывести средний остаток с 9 янв по 17 янв. Примечание. В банке, в части экономии ресурсов SQL сервера, остатки по счету хранятся не на каждый день, а дифференцировано, когда были проводки. С другой стороны клиенту банка надо знать, какая сумма у него на счете за ЛЮБОЙ день. Исходные данные даны в таблице tblFactAmount ниже.

create table tblFactAmount (fAmount float, dtValueChange date)
;
insert into tblFactAmount (fAmount, dtValueChange)
values
(3, '20210101'),
(5, '20210110'),
(1, '20210114'),
(10,'20210116'),
(2, '20210117')

Вот мое решение. Оформил его в виде SP процедуры. Прежде, чем читать решение, подумайте 5 минут. Это намного интереснее. Вдруг ваше решение окажется лучше ...

 

Ещё...