Синтаксис SQL Server. Введення в MS SQL Server та T-SQL. Використання Multi-statement UDF

Ось повний перелікфункцій роботи з рядками, взятий із BOL:

ASCII NCHAR SOUNDEX
CHAR PATINDEX SPACE
CHARINDEX REPLACE STR
DIFFERENCE QUOTENAME STUFF
LEFT REPLICATE SUBSTRING
LEN REVERSE UNICODE
LOWER RIGHT UPPER
LTRIM RTRIM

Почнемо з двох взаємно зворотних функцій - ASCIIі CHAR.

Функція ASCII повертає код ASCII крайнього лівого символу рядкового виразу, що є аргументом функції.

Ось, наприклад, як можна визначити, скільки є різних букв, з яких починаються назви кораблів у таблиці Ships:


Слід зазначити, що аналогічний результат можна отримати простіше за допомогою ще однієї функції. LEFTяка має наступний синтаксис:

LEFT (<рядковий вираз>, <цілісний вираз>)

і вирізує задане другим аргументом число символів зліва з рядка, що є першим аргументом. Отже,

SELECT DISTINCT LEFT(name, 1) FROM Ships ORDER BY 1

А ось як, наприклад, можна отримати таблицю кодів усіх алфавітних символів:

SELECT CHAR(ASCII("a")+ num-1) letter, ASCII("a")+ num - 1
FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num
FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
CROSS JOIN
(SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
CROSS JOIN
(SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
) x
WHERE ASCII("a")+ num -1 BETWEEN ASCII("a") AND ASCII("z")

Тих, хто ще не в курсі генерації числової послідовності, надсилаю до відповідної статті .

Як відомо, коди малих і великих літервідрізняються. Тому щоб отримати повний набірбез переписування запиту, досить просто дописати до наведеного вище коду аналогічний:


Я вважаю, що не буде складним додати цю літеру до таблиці, якщо потрібно.

Розглянемо тепер завдання визначення знаходження підрядки в рядковому вираженні. Для цього можуть використовуватись дві функції - CHARINDEXі PATINDEX. Обидві вони повертають початкову позицію (позицію першого символу підрядка) підрядки у рядку. Функція CHARINDEX має синтаксис:

CHARINDEX ( шуканий_вираз, рядковий_вираз[, стартова_позиція])

Тут необов'язковий цілісний параметр стартова_позиціявизначає позицію у рядковому виразі, починаючи з якої виконується пошук шуканого_виразу. Якщо цей параметр опущено, пошук виконується від початку строкового_виразу. Наприклад, запит

Слід зазначити, що й шукана підрядок чи рядкове вираз є NULL, то результатом функції теж буде NULL.

Наступний приклад визначає позиції першого та другого входження символу "a" в імені корабля "California"

SELECT CHARINDEX("a",name) first_a,
CHARINDEX("a", name, CHARINDEX("a", name)+1) second_a
FROM Ships WHERE name="California"

Зверніть увагу, що при визначенні другого символу функції використовується стартова позиція, якою є позиція наступного за першою літерою "a" символу - CHARINDEX("a", name) +1. Правильність результату - 2 та 10 - легко перевірити:-).

Функція PATINDEX має синтаксис:

PATINDEX ("% зразок%" , рядковий_вираз)

Головна відмінність цієї функції від CHARINDEX полягає в тому, що пошукова строкаможе містити підстановочні знаки- % та _. При цьому кінцеві символи "%" є обов'язковими. Наприклад, використання цієї функції в першому прикладі матиме вигляд


Результат виконання цього запиту виглядає так:


Те, що в результаті ми отримаємо порожній результуючий набір, означає, що таких кораблів у базі даних немає. Давайте візьмемо комбінацію значень – клас та ім'я корабля.

З'єднання двох рядкових значень в одне називається конкатенацією, і в SQL Server для цієї операції використовується знак "+" (у стандарті "||"). Отже,

А якщо рядковий вираз міститиме лише одну літеру? Запит виведе її. У цьому легко переконатись, написавши

Для отримання даних із бази даних використовується мова SQL. SQL - це мова програмування, яка дуже нагадує англійську, але призначена для програм управління базами даних. SQL використовується у кожному запиті в Access.

Розуміння принципів роботи SQLдопомагає створювати більше точні запитита спрощує виправлення запитів, які повертають неправильні результати.

Це стаття з циклу статей про мову SQL для Access. У ній описані основи використання SQL для вибірки даних та наведено приклади синтаксису SQL.

В цій статті

Що таке SQL?

SQL - це мова програмування, призначений для роботи з наборами фактів та відносин між ними. У програмах управління реляційними базамиданих, таких як Microsoft Office Access, мова SQL використовується для роботи з даними. На відміну від багатьох мов програмування, SQL легко читаємо і зрозумілий навіть новачкам. Як і багато мов програмування, SQL є міжнародним стандартом, визнаним такими комітетами зі стандартизації, як ISO та ANSI.

На мові SQL описуються набори даних, які допомагають отримувати відповіді питання. При використання SQLслід застосовувати правильний синтаксис. Синтаксис – це набір правил, що дозволяють правильно поєднувати елементи мови. Синтаксис SQLзаснований на синтаксисі англійської мовиі має багато спільних елементів із синтаксисом мови Visual Basic для програм (VBA).

Наприклад, проста інструкція SQL, що отримує список прізвищ контактів з ім'ям Mary, може виглядати так:

SELECT Last_Name
FROM Contacts
WHERE First_Name = "Mary";

Примітка:Мова SQL використовується не тільки для виконання операцій над даними, але ще й для створення та зміни структури об'єктів бази даних, наприклад, таблиць. Частина SQL, яка використовується для створення та зміни об'єктів бази даних, називається мовою опису даних DDL. Мова DDL не розглядається у цій статті. додаткові відомостідив. у статті Створення та зміна таблиць або індексів за допомогою запиту визначення даних.

Інструкції SELECT

Інструкція SELECT використовується для опису набору даних на мові SQL. Вона містить повний описнабору даних, які необхідно отримати з бази даних, включаючи:

    таблиці, у яких містяться дані;

    зв'язки між даними з різних джерел;

    поля чи обчислення, на основі яких відбираються дані;

    умови відбору, яким мають відповідати дані, що включаються до результату запиту;

    необхідність та спосіб сортування.

Пропозиції SQL

Інструкція SQL складається з кількох частин, які називаються пропозиціями. Кожна пропозиція в інструкції SQL має призначення. Деякі пропозиції є обов'язковими. У наведеній нижче таблиці вказано пропозиції SQL, що використовуються найчастіше.

Пропозиція SQL

Опис

Обов'язкове

Визначає поля, які містять необхідні дані.

Визначає таблиці, які містять поля, зазначені у реченні SELECT.

Визначає умови відбору полів, яким мають відповідати всі записи, що включаються до результатів.

Визначає порядок сортування результатів.

В інструкції SQL, яка містить статистичні функції, визначає поля, для яких у пропозиції SELECT не обчислюється зведене значення.

Тільки за наявності таких полів

В інструкції SQL, яка містить статистичні функції, визначає умови, що застосовуються до полів, для яких у пропозиції SELECT обчислюється зведене значення.

Терміни SQL

Кожна пропозиція SQL складається з термінів, які можна порівняти з частинами мови. У наведеній нижче таблиці наведено типи термінів SQL.

Термін SQL

Порівняна частина мови

Визначення

приклад

ідентифікатор

іменник

Ім'я, яке використовується для ідентифікації об'єкта бази даних, наприклад, ім'я поля.

Клієнти.[НомерТелефону]

оператор

дієслово чи прислівник

Ключове слово, яке репрезентує дію або змінює його.

константа

іменник

Значення, яке не змінюється, наприклад, число або NULL.

вираз

прикметник

Поєднання ідентифікаторів, операторів, констант та функцій, призначене для обчислення одного значення.

>= Товари.[Ціна]

Основні пропозиції SQL: SELECT, FROM та WHERE

Загальний формат інструкцій SQL:

SELECT field_1
FROM table_1
WHERE criterion_1
;

Примітки:

    Access не враховує розрив рядків в інструкції SQL. Незважаючи на це, кожну пропозицію рекомендується починати з нового рядкащоб інструкцію SQL було зручно читати як тому, хто її написав, так і всім іншим.

    Кожна інструкція SELECT закінчується крапкою з комою (;). Крапка з комою може стояти як наприкінці останньої пропозиції, так і на окремому рядку наприкінці інструкції SQL.

Приклад у Access

У наведеному нижче прикладі показано, як у Access може виглядати інструкція SQL для простого запитуна вибірку.

1. Пропозиція SELECT

2. Пропозиція FROM

3. Пропозиція WHERE

Розберемо приклад за пропозиціями, щоб зрозуміти, як працює синтаксис SQL.

Пропозиція SELECT

SELECT, Company

Це пропозиція SELECT. Воно містить оператор (SELECT), за яким слідують два ідентифікатори ("[Адреса електронної пошти]" та "Компанія").

Якщо ідентифікатор містить пробіли або спеціальні знаки(наприклад, "Адреса електронної пошти"), він повинен бути укладений у прямокутні дужки.

У пропозиції SELECT не потрібно вказувати таблиці, в яких містяться поля, і не можна задати умови відбору, яким повинні відповідати дані, що включаються до результатів.

В інструкції SELECT пропозиція SELECT завжди стоїть перед пропозицією FROM.

Пропозиція FROM

FROM Contacts

Це пропозиція FROM. Воно містить оператор (FROM), за яким слідує ідентифікатор (Контакти).

Пропозиція FROM не вказує поля для вибірки.

Пропозиція WHERE

WHERE City="Seattle"

Ця пропозиція WHERE. Воно містить оператор (WHERE), за яким слідує вираз (Місто = "Ростов").

За допомогою пропозицій SELECT, FROM та WHERE можна виконувати безліч дій. Щоб отримати додаткові відомості про використання цих пропозицій, див.

Сортування результатів: ORDER BY

як і в Microsoft ExcelУ Access можна сортувати результати запиту в таблиці. Використовуючи пропозицію ORDER BY, ви також можете вказати спосіб сортування результатів під час виконання запиту. Якщо використовується пропозиція ORDER BY, вона повинна знаходитись наприкінці інструкції SQL.

Пропозиція ORDER BY містить список полів, для яких потрібно виконати сортування, у тому самому порядку, в якому будуть застосовані сортування.

Припустимо, наприклад, що результати спочатку потрібно відсортувати по полю "Компанія" в порядку зменшення, а потім, якщо присутні записи з однаковим значеннямполя "Компанія", - відсортувати їх по полю "Адреса електронної пошти" в порядку зростання. Пропозиція ORDER BY буде виглядати так:

ORDER BY Company DESC,

Примітка:За умовчанням Access сортує значення за зростанням (від А до Я, від найменшого до найбільшого). Щоб замість цього виконати сортування значень зі спадання, необхідно вказати ключове слово DESC.

Додаткові відомості про пропозицію ORDER BY див. у статті Пропозиція ORDER BY.

Робота зі зведеними даними: пропозиції GROUP BY та HAVING

Іноді виникає необхідність роботи зі зведеними даними, такими як підсумковий продаж за місяць або найдорожчі товари на складі. Для цього у пропозиції SELECT до поля застосовується агрегатна функція. Наприклад, якщо в результаті виконання запиту потрібно отримати кількість адрес електронної пошти кожної компанії, пропозиція SELECT може виглядати так:

Можливість використання тієї чи іншої агрегатної функції залежить від типу даних у полі та потрібного виразу. Додаткові відомості про доступні агрегатні функції див. у статті Статистичні функції SQL.

Завдання полів, які не використовуються в агрегатній функції: пропозиція GROUP BY

При використанні агрегатних функцій зазвичай потрібно створити пропозицію GROUP BY. У пропозиції GROUP BY вказуються всі поля, до яких не застосовується функція агрегату. Якщо агрегатні функції застосовуються до всіх полів у запиті, GROUP BY пропозицію створювати не потрібно.

Пропозиція GROUP BY повинна йти відразу ж за пропозицією WHERE або FROM, якщо пропозиція WHERE відсутня. У пропозиції GROUP BY поля вказуються в тому самому порядку, що й у пропозиції SELECT.

Продовжимо попередній приклад. Нехай у пропозиції SELECT агрегатна функція застосовується тільки до поля [Адреса електронної пошти], тоді пропозиція GROUP BY буде виглядати наступним чином:

GROUP BY Company

Додаткові відомості про пропозицію GROUP BY див. у статті Пропозиція GROUP BY.

Обмеження агрегованих значень за умов групування: пропозиція HAVING

Якщо необхідно вказати умови для обмеження результатів, але поле, до якого їх потрібно застосувати, використовується в агрегованої функції, пропозицію WHERE використовувати не можна. Замість нього слід використовувати пропозицію HAVING. Пропозиція HAVING працює так само, як і WHERE, але використовується для агрегованих даних.

Припустимо, наприклад, що до першого поля у реченні SELECT застосовується функція AVG(яка обчислює середнє значення):

SELECT COUNT(), Company

Якщо ви хочете обмежити результати запиту на основі значення функції COUNT, до цього поля не можна застосувати умову відбору у пропозиції WHERE. Замість умови слід помістити в пропозицію HAVING. Наприклад, якщо потрібно, щоб запит повертав рядки тільки в тому випадку, якщо компанія має кілька адрес електронної пошти, можна використовувати таку пропозицію HAVING:

HAVING COUNT()>1

Примітка:Запит може включати пропозицію WHERE, і пропозицію HAVING, при цьому умови відбору для полів, які не використовуються в статистичних функціях, вказуються в реченні WHERE, а умови для полів, що використовуються в статистичних функціях, - у реченні HAVING.

Додаткові відомості про пропозицію HAVING див. у статті Пропозиція HAVING.

Об'єднання результатів запиту: оператор UNION

Оператор UNION використовується для одночасного перегляду всіх даних, що повертаються кількома запитами на вибірку, у вигляді об'єднаного набору.

Оператор UNION дозволяє об'єднати дві вказівки SELECT в одну. Об'єднані інструкції SELECT повинні мати однакове числоі порядок вихідних полів з такими самими сумісними типами даних. При виконанні запиту дані кожного набору відповідних полів об'єднуються в одне вихідне поле, тому вихідні дані запиту мають стільки ж полів, скільки і кожна інструкція SELECT окремо.

Примітка:У запитах на об'єднання числовий та текстові типиданих сумісні.

Використовуючи оператор UNION, можна вказати, чи повинні до результатів запиту включатися рядки, що повторюються, якщо такі є. Для цього слід використати ключове слово ALL.

Запит на об'єднання двох інструкцій SELECTмає наступний базовий синтаксис:

SELECT field_1
FROM table_1
UNION
SELECT field_a
FROM table_a
;

Припустимо, наприклад, що є дві таблиці, які називаються "Товари" та "Послуги". Обидві таблиці містять поля з назвою товару або послуги, ціною та відомостями про гарантію, а також поле, в якому вказується ексклюзивність товару або послуги, що пропонується. Незважаючи на те, що в таблицях "Продукти" та "Послуги" передбачено різні типигарантій, основна інформація та сама (надається на окремі продукти або послуги гарантія якості). Для об'єднання чотирьох полів із двох таблиць можна використовувати наступний запит на об'єднання:

SELECT name, price, warranty_available, exclusive_offer
FROM Products
UNION ALL
SELECT name, price, guarantee_available, exclusive_offer
FROM Services
;

Щоб отримати додаткові відомості про поєднання інструкцій SELECT за допомогою оператора UNION, див.

Останнє оновлення: 24.06.2017

SQL Server є однією з найбільш популярних системуправління базами даних (СУБД) у світі. Ця СУБД підходить для різних проектів: від невеликих додатків до великих високонавантажених проектів.

SQL Server був створений компанією Microsoft. Перша версія вийшла 1987 року. А поточною версієює версія 16, яка вийшла у 2016 році і яка буде використовуватись у поточному посібнику.

SQL Server довгий часбув виключно системою управління базами даних для Windows, проте починаючи з версії 16 ця система доступна і на Linux.

SQL Server характеризується такими особливостями як:

    Продуктивність. SQL Server працює дуже швидко.

    Надійність та безпека. SQL Server надає шифрування даних.

    Простота. З цієї СУБД щодо легко працювати та вести адміністрування.

Центральним аспектом у MS SQL Server, як і будь-який СУБД, є база даних. База даних представляє сховище даних, організованих певним способом. Нерідко фізично база даних представляє файл на жорсткому диску, хоча така відповідність необов'язково. Для зберігання та адміністрування баз даних застосовуються системи управління базами даних (database management system) або СУБД (DBMS). І саме MS SQL Server є однією з таких СУБД.

Для організації баз даних MS SQL Server використовує реляційну модель. Ця модель баз даних була розроблена ще в 1970 Едгаром Коддом. А на сьогодні вона фактично є стандартом для організації баз даних.

Реляційна модель передбачає зберігання даних у вигляді таблиць, кожна з яких складається з рядків та стовпців. Кожен рядок зберігає окремий об'єкт, а в стовпцях розміщуються атрибути цього об'єкта.

Для ідентифікації кожного рядка у межах таблиці застосовується первинний ключ (primary key). Як первинний ключ може виступати один або кілька стовпців. Використовуючи первинний ключ, ми можемо посилатися на певний рядокв таблиці. Відповідно два рядки не можуть мати один і той же первинний ключ.

Через ключі одна таблиця може бути пов'язана з іншою, тобто між двома таблицями можуть бути організовані зв'язки. А сама таблиця може бути представлена ​​у вигляді відношення ("relation").

Для взаємодії з базою даних використовується мова SQL (Structured Query Language). Клієнт (наприклад, зовнішня програма) надсилає запит мовою SQL за допомогою спеціального API. СУБД належним чином інтерпретує та виконує запит, а потім надсилає клієнту результат виконання.

Спочатку мова SQL була розроблена в компанії IBM для системи баз даних, яка називалася System/R. При цьому сама мова називалася SEQUEL (Structured English Query Language). Хоча в результаті ні база даних, ні сама мова не згодом були офіційно опубліковані, за традицією сам термін SQL нерідко вимовляють як "сіквел".

У 1979 році компанія Relational Software Inc. розробила першу систему управління баз даних, яка називалася Oracle і використовувала мову SQL. У зв'язку з успіхом даного продуктукомпанія була перейменована на Oracle.

Згодом почали з'являтися інші системи баз даних, які використовували SQL. У результаті в 1989 році Американський Національний Інститут Стандартів (ANSI) кодифікував мову та опублікував її перший стандарт. Після цього стандарт періодично оновлювався та доповнювався. Останнє його оновлення відбулося у 2011 році. Але незважаючи на наявність стандарту, нерідко виробники СУБД використовують свої власні реалізації мови SQLякі трохи відрізняються один від одного.

Виділяються два різновиди мови SQL: PL-SQL та T-SQL. PL-SQL використовується у таких СУБД як Oracle та MySQL. T-SQL (Transact-SQL) застосовується у SQL Server. Саме тому в рамках поточного керівництва розглядатиметься саме T-SQL.

Залежно від завдання, яке виконує команда T-SQL, він може належати до одного з таких типів:

    DDL (Data Definition Language/Мова визначення даних). До цього типу належать різні команди, які створюють базу даних, таблиці, індекси, процедури, що зберігаються і т.д. Загалом визначають дані.

    Зокрема, до цього типу ми можемо віднести такі команди:

    • CREATE : створює об'єкти бази даних (саму базу даних, таблиці, індекси тощо)

      ALTER : змінює об'єкти бази даних

      DROP: видаляє об'єкти бази даних

      TRUNCATE: видаляє всі дані з таблиць

    DML (Data Manipulation Language/Мова маніпуляції даними). До цього типу відносять команди з вибору даних, їх оновлення, додавання, видалення - загалом усі команди, з допомогою якими ми можемо управляти даними.

    До цього типу належать такі команди:

    • SELECT : отримує дані з БД

      UPDATE : оновлює дані

      INSERT: додає нові дані

      DELETE: видаляє дані

    DCL (Data Control Language/Мова керування доступу до даних). До цього типу відносять команди, які керують правами доступу до даних. Зокрема, це такі команди:

    • GRANT : надає права на доступ до даних

      REVOKE: відкликає права на доступ до даних

Синтакс SQL

Цей розділ описує основні відмінності у синтаксі мови SQL, що використовується СУБД Firebird та MS SQL.

СУБД Firebird та MS SQL можуть посилатися на об'єкти бази даних (таблиці, поля тощо) за їх іменами безпосередньо, якщо імена об'єктів не містять прогалини та інші неприпустимі в прямому засланні символи (наприклад, нелатинські літери). Для використання прогалин та інших символів СУБД MS SQL використовує квадратні дужки, [ і ] , а СУБД Firebird використовує подвійні лапкиЩе одна відмінність - можливість використання в СУБД MS SQL схемидля посилання на об'єкт: база_даних.власник_объекта.объект. СУБД Firebird не припускає такої нотації.

Увага

СУБД MS SQL використовує регістро-залежні імена об'єктів, якщо під час встановлення Ви вибрали використання розрізнення регістру символів; інакше, імена об'єктів регістро-незалежні. Весело? Не дуже...

Підказка

СУБД MS SQL здатна працювати з ідентифікаторами, імена яких укладені в подвійні лапки, але за умовчанням ця можливість доступна лише за доступу через OLE DB і ODBC, але з доступу через DB-Library. З цієї причини таку практику слід уникати.

СУБД MS SQL 7 і вище підтримує з'єднання (joins) (оновлення, видалення, вставка). СУБД Firebird не розпізнає такий синтакс.

Типи даних, звісно, ​​різняться. Хоча обидві СУБД мають загальне підмножина типів, що найчастіше використовуються. Це питання рідко викликає проблеми при перенесенні бази даних.

Розрізняються вбудовані функції. Більшість із вбудованих функцій СУБД MS SQL можна замінити в СУБД Firebird використанням функцій, які визначають користувач (UDFs).

Розрізняються формати вказівок строкових констант для дат. СУБД Firebird приймає рядки різних форматів, незалежно від використовуваної платформи. СУБД MS SQL, у свою чергу, використовує суміщення серверо-незалежних, серверо-платформних форматів та формату налаштування клієнтського з'єднання. Додатково методи доступу СУБД MS SQL зазвичай вводять один або два рівні, в яких рядкова константа може бути перетворена в дату тим чи іншим чином.

У СУБД MS SQL можна визначати Велика кількістьзмінних оточення, ніж у СУБД Firebird, але найбільш загальні можна знайти і в СУБД Firebird (витяг ідентифікатора та імені користувача). Єдина важлива змінна, яка відсутня в СУБД Firebird - це змінна, що повертає кількість рядків останньої операції (з версії 1.5 СУБД Firebird така змінна введена - прим. перекл.).

Важливе відмінність було у цьому, що СУБД Firebird 1.0 не підтримувала оператор CASE СУБД MS SQL. Іноді можна було замінити його функціональність використанням процедури, що зберігається. Починаючи з версії 1.5, СУБД Firebird підтримує використання оператора CASE.

Невелика відмінність між СУБД ще й у тому, що СУБД MS SQL не використовує роздільників для операторів, що може служити джерелом помилок при переході, що важко виявляються, особливо при використанні безлічі дужок. СУБД Firebird у скриптах вимагає завершувати кожен оператор крапкою з комою (якщо не визначено іншого роздільника - прим. перекл.), тому помилки легше виявити.

Обидві СУБД MS SQL і Firebird підтримують коментарі між роздільниками /* і */ . СУБД MS SQL також підтримує синтакс "два дефіси" - для однорядкового коментаря. Деякі утиліти для СУБД Firebird також підтримують такий синтакс.

WHILE

Оператор WHILEіснує в обох СУБД Firebird та MS SQL, але з деякими відмінностями. Не існує операторів BREAKабо CONTINUE, але їх можна емулювати за допомогою додаткових конструкцій. Також є невелика відмінність у синтаксисі: СУБД Firebird вимагає наявності ключового слова DO після умови циклу. Порівняйте такі еквівалентні частини коду.

/ * Синтакс Firebird. */ WHILE (i< 3) DO BEGIN i = i + 1; j = j * 2; END /* Синтакс MS SQL. */ WHILE (i < 3) BEGIN SET @i = @i + 1 SET @j = @j * 2 END

RETURN

Оператор RETURN в СУБД MS SQL повертає значення цілісної змінної та припиняє виконання. У СУБД Firebird існує оператор EXIT, який передає управління на заключний END процедури, що зберігається. Однак тут немає прихованої змінної, що повертається, тому, якщо Вам необхідно повернути деяке значення (що опціонально в СУБД MS SQL), Ви повинні явно оголосити змінну, що повертається в процедурі.

WAITFOR

Оператор WAITFOR в СУБД MS SQL зупиняє виконання на деякий час або до настання вказаного часу. Щось подібне можна здійснити за допомогою функцій, які визначають користувач (UDFs), в СУБД Firebird . Але в обох СУБД використання такого оператора слід виключити, оскільки взаємодія з клієнтом повністю припиняється (в СУБД Firebird це може призвести і до припинення обслуговування всіх з'єднань, а не тільки з'єднання, що викликало аналог вказаного оператора - прим. перекл.).

Стандартні оператори

Стандартними операторами, що є в обох СУБД, є SELECT , INSERT , UPDATE і DELETE . СУБД Firebird та MS SQL підтримують їх, але в СУБД MS SQL є кілька нестандартних розширень цих операторів, про які необхідно розповісти на випадок їхнього використання.

У СУБД Firebird оператор SELECT не дозволяє використовувати ключове слово INTO для створення нової таблиці "на льоту". Натомість, ключове слово INTO використовується для зв'язку результату запиту зі змінною.

/* Синтаксис MS SQL для надання значення поля змінної. */ SELECT @my_state = state FROM authors WHERE auth_name = "John" /* Синтаксис Firebird. */ SELECT state INTO:state /* --> зверніть увагу на ":" перед ім'ям змінної */ FROM authors WHERE auth_name = "John"

У СУБД MS SQL 7 і вище оператору SELECTможна вказувати специфікатор TOP для організування набору даних, що повертається. Ця функція в теперішній моментзнаходиться у стадії розробки для СУБД Firebird. (Специфікатори FIRST та SKIP у СУБД Firebird введені, починаючи з версії 1.5. - прим. перекл.)

Обидві СУБД MS SQL та Firebird підтримують звичайний синтаксис оператора INSERT та оператора INSERT..SELECT.

Обидві СУБД MS SQL та Firebird підтримують звичайний синтаксис оператора UPDATE. СУБД MS SQL також підтримує синтаксис оператора UPDATE , в якому виконується з'єднання (join) та проводиться оновлення однієї з таблиць з'єднання. Можна думати про це як про умови WHEREна стероїдах. Якщо така функція дуже потрібна, її можна реалізувати в СУБД Firebird з використанням уявлень (views).

Обидві СУБД MS SQL та Firebird підтримують звичайний синтаксис оператора DELETE. СУБД MS SQL також підтримує оператор TRUNCATE TABLE, який ефективніший (але й небезпечніший), ніж оператор DELETE. (СУБД MS SQL також підтримує синтаксис оператора DELETE, в якому виконується з'єднання. - прим. перекл.)

/* Синтаксис MS SQL видалення всіх записів my_table. */ TRUNCATE TABLE my_table /* ...або... */ DELETE FROM my_table /* Синтаксис Firebird. */ DELETE FROM my_table

Використання транзакцій

У СУБД Firebird у DSQL (dynamic SQL) транзакції «безпосередньо» не використовуються. Іменовані транзакції у разі недоступні зовсім. (Оператори DSQL виконуються у контексті транзакцій, запущених і контрольованих клієнтським додатком.- прим. перекл.) Синтаксис обох СУБД підтримує ключове слово WORK для сумісності.

У більшості випадків проблем із транзакціями не повинно виникати: явне керування транзакціями «на місці» в СУБД MS SQL використовується зазвичай через відсутність підтримки керуванням через виключення (exceptions).

Підказка

У СУБД MS SQL є глобальна змінна XACT_ABORT , яка управляє відкатом транзакції у разі помилки часу виконання (run-time error). В іншому випадку Вам необхідно перевіряти значення змінної @@ERROR після виконання кожного оператора.

Загалом більшість проблем, пов'язаних з рівнями ізоляції транзакцій в СУБД MS SQL, пропадають при переході на СУБД Firebird. Суперництво між «читачами» та «письменниками» мінімальне за рахунок використання багатоверсійної архітектури (multigeneration architecture, MGA).

У СУБД MS SQL курсори використовуються в основному для переміщення за результатами запитів, щоб виконати з цими результатами деякі дії. Крім синтаксису, немає великої різниці до виконання однієї й тієї завдання. Хоча існують опції для переміщення вперед і назад, на практиці використовуються здебільшого односпрямовані курсори.

/ * Синтакс MS SQL. */ DECLARE my_cursor CURSOR FOR SELECT au_lname FROM authors ORDER BY au_lname DECLARE @au_lname varchar(40) OPEN my_cursor FETCH NEXT FROM my_cursor INTO @au_lname WHILE @@FETCH_STATUS = 0 BEGIN */ FETCH NEXT FROM my_cursor END CLOSE my_cursor DEALLOCATE my_cursor /* Синтакс Firebird. */ DECLARE VARIABLE au_lname VARCHAR(40); ... FOR SELECT au_lname FROM authors ORDER BY au_lname INTO: au_lname DO BEGIN /* Зробити щось цікаве з au_lname. */ END

Зауважте, що СУБД MS SQL може розміщувати курсори в змінних і передавати ці змінні як параметри; це неможливо в СУБД Firebird.