Динамічний SQL

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

особливо корисний у наступних ситуаціях

■ Для складання пропозиції WHERE з безлічі можливих критеріїв

■ Для складання пропозиції FROM, що включає тільки ті таблиці та обєднання, які необхідні пропозицією WHERE

■ Для створення динамічного пропозиції ORDER BY, по-різному упорядочивающего дані в залежності від потреб користувача

Виконання інструкцій динамічного SQL

Команда execute (або скорочено Ехес) створює новий екземпляр пакета, як якби виконуваний код був збереженої процедурою Незважаючи на те що команда execute зазвичай використовується для виклику збережених процедур, її також можна використовувати для запуску пакетів і запитів T-SQL:

Ехес [UTE] (пакет_Т-SQL)

WITH RECOMPILE

Параметр WITH RECOMPILE змушує SQL Server перекомпілювати пакет і створити новий план виконання запиту Якщо рядок Т-SQL і її параметри піддаються сильним змінам, то параметр WITH RECOMPILE дозволить уникнути виконання помилкового плану Водночас, якщо рядок Т-SQL не схильна до змін, непотрібний процес перекомпіляції тільки сповільнить виконання запиту Більшість процедур динамічного SQL створюють докорінно відрізняються запити SQL, так що параметр WITH RECOMPILE в даному випадку звичайно доречний

Наприклад, наступна команда Ехес виконує звичайну інструкцію SELECT:

USE Family

Ехес (Select LastName from Person Where PersonID = 12)

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

LastName

Halloway

При роботі з командою Ехес слід враховувати контекст безпеки використан-Новинка 1 няемого коду У версії SQL Server 2005 введений синтаксис execute as для яв-2005 ного завдання контексту безпеки Детально контекст безпеки і сін

таксис команди execute as розглядаються в розділі 40

Новинкою в команді execute є можливість виконання коду на свя-Новинка занном, а не тільки на локальному сервері Наступний код передається на уда-2005 ленний сервер, а результати повертаються на локальний:

Ехес [UTE] {код) АТ імя_связанного_сервера

sp_executeSQL

Новий метод виконання динамічного SQL полягає у використанні системної збереженої процедури sp_exe cute SQL Цей метод більше підходить для складних запитів, ніж звичайна команда execute Я помітив, що в деяких ситуаціях команда exceute не справлялася з виконанням динамічних запитів, в той час як процедура sp_exe cute SQL працювала бездоганно

Ехес Sp_ExecuteSQL 1запит T-SQL1, Определеніе_параметров, параметр, параметр ..

У рядку 4запит T-SQU не допускається конкатенація рядків, тому параметри не вказуються Сам запит і визначення повинні використовувати таблицю символів Unicode

Параметри збереженої процедури призначені для оптимізації Якщо запит T-SQL при кожному запуску використовує одні й ті ж параметри, то вони можуть бути передані збереженій процедурі sp_exe cute SQL, щоб сформувати план виконання запиту У наступному прикладі виконується той же запит до таблиці Person бази даних Family, але в даному випадку використані параметри (буква N необхідна, так як повинні використовуватися рядка в кодуванні Unicode):

EXEC sp_executeSQL NSelect LastName From Person

Where PersonID = @PersonSelect1,

N1©PersonSelect INT1,

@PersonSelect = 12

Результат буде отриманий той же:

LastName

Halloway

Створення динамічного коду SQL

Створення динамічних рядків коду SQL звичайно припускає комбінування вираження SELECT COLUMNS з більш гнучкими пропозиціями FROM і WHERE

Після створення рядка запиту він може бути виконаний за допомогою все тієї ж команди Ехес Пропонований приклад запиту використовує пропозиції FROM і WHERE, грунтуючись на вимогах користувача

У прикладі битовая мінлива Needs And відстежує потреби і за допомогою звязки AND обєднує їх в реченні WHERE Якщо задана категорія товару, то початкова частина інструкції SELECT включає в себе всі необхідні обєднання таблиці ProductCategory Пропозиція WHERE обстежує всі можливі критерії користувача Якщо користувач задав для стовпця деякий критерій, то він разом з цим критерієм додається в рядок @ SQLWhere

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

USE OBXKites

DECLARE

@SQL NVARCHAR(1024),

@SQLWhere NVARCHAR(1024),

@NeedsAnd BIT,

– Користувацькі параметри @ ProductName VARCHAR (50),

@ProductCode VARCHAR(IO),

@ProductCategory VARCHAR(50)

– Ініціалізація змінних SET @ NeedsAnd = 0

SET @SQLWhere =

– Імітація вимог користувача SET © ProductName = NULL

SET @ProductCode = 1001

SET @ProductCategory = NULL

– Збірка динамічного запиту – Налаштування початкової частини інструкції IF @ ProductCategory IS NULL

SET @SQL = Select ProductName from Product

ELSE

SET @SQL = Select ProductName from Product Join ProductCategory

on ProductProductCategorylD

= ProductCategoryProductCategorylD;

– Збірка динамічного пропозиції WHERE IF @ ProductName IS NOT NULL BEGIN

SET @SQLWhere = ProductName = + @ProductName

SET @NeedsAnd = 1

END

IF @ProductCode IS NOT NULL BEGIN

IF ©NeedsAnd = 1

SET @SQLWhere = @SQLWhere + and ;

SET ©SQLWhere = Code = + @ProductCode

SET @NeedsAnd = 1

END

IF ©ProductCategory IS NOT NULL BEGIN

IF @NeedsAnd = 1

SET @SQLWhere = @SQLWhere + and ;

SET @SQLWhere = ProductCategory = + @ProductCategory

SET @NeedsAnd = 1

END

– Остаточне складання запиту SELECT IF @ SQLWhere <> ‘

SET @SQL = @SQL + WHERE + ©SQLWhere Print @SQL

EXEC sp_executeSQL @SQL WITH RECOMPILE

У результатах показаний як текст сформованого динамічного запиту, так і отриманий в результаті його виконання набір даних:

Select Name from Product where Code = 1001

Name

Basic Box Kite 21 inch

Додаткова Метод динамічного аудиту використовує складний запит SQL в збереженої про-чнформаці. процедурі Цей метод ми докладно розглянемо в розділі 24

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*